Je développe actuellement un logiciel (Delphi Alexandria) qui doit remplir une table Firebird à partir de fichiers CSV lus depuis un serveur REST.
J'ai pensé à utiliser un composant FDBatchMove pour effectuer facilement la conversion avec les "reader" et "writer" qui vont bien.
Comme le résultat n'était pas satisfaisant (seule la première colonne de données était transférée), j'ai simplifié le problème en écrivant le petit test suivant qui lit un CSV et en fabrique un autre, juste en changeant les séparateurs :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| procedure TForm16.FormCreate(Sender: TObject);
var fTest: TFileStream; fCopy: TMemoryStream;
begin
fTest := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'test.txt', fmOpenRead);
Original.Lines.LoadFromStream(fTest);
fCopy := TMemoryStream.Create;
try
FDBatchMove.Mode := dmAlwaysInsert;
with TFDBatchMoveTextReader.Create(FDBatchMove) do begin
Stream := fTest;
DataDef.Separator := ',';
DataDef.Delimiter := ',';
DataDef.WithFieldNames := true;
end;
with TFDBatchMoveTextWriter.Create(FDBatchMove) do begin
Stream := fCopy;
DataDef.Separator := ';';
DataDef.Delimiter := '/';
DataDef.WithFieldNames := false;
end;
FDBatchMove.GuessFormat();
FDBatchMove.Execute;
fCopy.Position := 0;
Copy.Lines.LoadFromStream(fCopy);
finally
fTest.Free;
fCopy.Free;
end;
with FDBatchMove do StatusBar.SimpleText := 'Read: ' + IntToStr(ReadCount)
+ ' Inserted: ' + IntToStr(InsertCount) + ' Written: ' + IntToStr(WriteCount);
end; |
Pour le fichier initial suivant (stream fTest):
nom,date,ville
Dupont,2000-01-01,Fouilly-les-Oies
Durand,2000-02-02,Lons-le-Saunier
Martin,2000-03-03,Paris
J'obtiens (stream fCopy):
/nom/;//;//
/Dupont/;//;//
/Durand/;//;//
/Martin/;//;//
Le format a bien été changé, mais seule la première colonne est renseignée et l'intitulé des champs semble ne pas avoir été compris.
Merci d'avance si vous pouvez m'aider à trouver mon erreur !
Partager