Després de massa temps sense escriure continuarem amb la generació dels dtsx per carregar TextFiles. En l'anterior post (
http://www.eljordifabi.tech/2016/07/adeu-biml-text-file.html) vam veure com generar la metadata.
El primer punt diferencial respecte la resta d'orígens de dades és la creació de la connexió. Anem a explorar el fitxer
UT_generateConnections.biml
En la definició de FlatFileConnection hi ha l'atribut FileFormat. Aquest atribut fa referència al tag FileFormats de final de tot del fitxer. Dins de FileFormats es defineixen les diferents columnes que tindran els fitxers i també atributs com poden ser el separador de columnes i de files, si té capçalera, etc. Tots aquests atributs els recuperarem de la metadata generada. Cal tenir en compte els tipus de separadors que accepta BIML i com escriure'ls
case row_delimiter when '{CR}{LF}' then 'CRLF' when '{CR}' then 'CR' when '{LF}' then 'LF' when ';' then 'Semicolon' when ',' then 'Comma' when 'tab' then 'Tab' when '|' then 'VerticalBar' else row_delimiter end as row_delimiter
Per a completar el tipus de dades utilitzarem la funció UT_SQLServer_datatype.SQLServerToBimlDatatype que està al fitxer: UT_SQLServer_datatype.cs que fa la traducció de SQLServer a tipus de dades BIML.
Un cop definides les FlatFileConnection amb els siure FileFormats ja es pot utilitzar la connexió.
En el nostre cas tenim l'opció de carregar un fitxer, o bé, carregar tots els fitxers d'una carpeta que continguin un patró en el nom. En el cas de carregar només un fitxer a l'espression de la connectionString hi haurà el path i el nom del fitxer, però al carregar els fitxers d'una carpeta hi haurà la variable que es farà servir dins del bucle.En el primer cas l'expression és opcional, en el segon és obligatòria.
<FlatFileConnection Name="<#= _table["source_name"] #>" FileFormat="<#= _table["source_name"] #>" FilePath="<#= _dbtable["connectionString"] #>" >
<# if (_param && (_packageName!="LoadData" || Convert.ToInt32( _dbtable["isFolder"]) ==0)) { #> <!-- o no és folder -->
<Expressions>
<Expression ExternalProperty="ConnectionString">@[$Project::<#= _table["source_name"] #>_Path]+@[$Project::<#= _table["source_name"] #>_File]</Expression>
</Expressions>
<# } #>
<# if (_packageName=="LoadData" && Convert.ToInt32( _dbtable["isFolder"]) !=0) { #> <!-- i és folder -->
<Expressions>
<Expression ExternalProperty="ConnectionString">@[User::File]</Expression>
</Expressions>
<# } #>
</FlatFileConnection>
En aquest fitxer es completa el dataFlow per a carregar les dades del fitxer a l'Staging Area. L'estructura és:
1) Truncar la taula de l'staging Area
2) Recórrer tots els fitxers si és una carpeta o un sol fitxer
3) Llegir el fitxer
4) Comptar les files llegides
5) Bolcar les dades a l'staging Area
6) Escriure les files carregades a la taula de Log
En cas de voler carregar les dades d'una carpeta utilitzarem el ForEachFileLoop.
<ForEachFileLoop Name="FL_file_loop" ConstraintMode="Linear" Folder="<#= _tableTD["path"] #>" FileSpecification="<#= _tableTD["pattern"] #>"
ProcessSubfolders="<#= _tableTD["traverse_subfolders"] #>" RetrieveFileNameFormat="FullyQualified">
i guardarem el valor de la connectionString a la variable File
<Variables>
<Variable Name="File" DataType="String"></Variable>
</Variables>
<VariableMappings>
<VariableMapping Name="0" VariableName="User.File" />
</VariableMappings>
Aquest és l'únic punt diferent respecte la resta de càrregues.
Amb aquest post s'acaba una primera sèrie on hem generat la metadata i els fitxers dtsx per carregar una BBDD SQL Server, un fitxer Excel (podent recòrrer les seves pestanyes dinàmicament) i un fitxer pla.