RetourForum Delphi
Nouveau compte - Se connecter - Perdu votre mot de passe?Recherche: Utilisateur - Message

Index > Forum général > lire un fichier texte et mettre le contenu dans excelNouveau post - Répondre
ABOUD36
visiteur
Message lire un fichier texte et mettre le contenu dans excel message: éditerle 02/01/13 à 18h34

bonsoir:

J'ai un fichier texte qui se compose de 100 conteurs ( 0BLR à 100BLR), un example d'un conteur ( 0BLR ) est listé ci-dessous 

IPL                                           
IN                                             
counter      SEC    B1    A-B  A-BS      INT
0BLR                  0    2      2        1 
                                               
OUT                                         
                                               
counter      SEC    B1    C-D  C-DS      INT
0BLR                  0    19    25        1 
                                               
DPL                                           
IN                                             
                                               
counter      SEC    B2    A-B  A-BS      INT
0BLR                  10    0      0        4 
                                               
OUT                                           
counter      SEC    B2    C-D  C-DS      INT
0BLR                  10    0      0        4 

je cherche a mettre le contenu dans fichier excel comme suit:

IN
counter      SEC    B1    A-B  A-BS      INT
0BLR                  0    2      2        1

IN
counter      SEC    B2    A-B  A-BS      INT
0BLR                  10    0      0        4 

d'ou B1 : c'est le  temp et INT ( intervalle) c-a-d : l'entete dans excel contient : counter      SEC    B1    A-B  A-BS      INT

et les valeurs de ce qui est en gras  viennent dessous .



j'ai commencer par ceci:

const
FileName = 'ounter.txt';
MyDir = 'C:\stat\';

procedure TForm1.Button1Click(Sender: TObject);
//* Lecture du Fichier
var
MyFileName : TFileName;
begin
MyFileName := MyDir + FileName;
ListBox1.Items.LoadFromFile(MyFileName);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
XLApp : Variant;
NbLigne : Integer;
Table1:Variant ;
MyFileName : TFileName;
begin
if MessageDlg('CONFIRMEZ EXPORTATION DE VOTRE FICHIER VERS EXCEL ?', mtConfirmation, [mbOK, mbCancel], 0) = mrOk then
begin
try
XLApp := CreateOleObject('Excel.Application');
except
ShowMessage('Démarrage de Microsoft Excel impossible');
Exit;
end;
XLApp.Visible := True;
XLApp.Workbooks.Add;

MyFileName := MyDir + FileName;

END;
end;

end.

NB: j'ai lu dans plusieurs forum je n'ai pas trouvé un example de fonction pour faire le split c-a-d:

charger le fichier dans stringlist et mettre des condition pour le transfert dans excel.

Si quelqu'un à une idée veuillez me réClin d'oeil langue ondre .



















tourlourou
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 03/01/13 à 14h09

Avant d'attaquer Excel, c'est à toi de charger le fichier texte dans un TStringList, puis de le parcourir en cherchant les mots-clefs et de filtrer les lignes souhaitées, puis de composer un fichier csv qu'Excel pourra ouvrir.

ZeuS-[SFX]
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 03/01/13 à 21h14

Comme dit tourlourou, il te faut charger ton fichier texte puis de le parser pour récupérer tes valeurs.
J'imagine que le fichier est composé de ligne donc séClin d'oeil langue aré par des retour chariot, puis chaque ligne est composé de champs délimités par des tabulations ?

Effectivement comme le dit tourlourou tu peux utiliser une Tstringlist moyen probablement le plus simple pas forcement le plus performant mais si tu n'as que 500-600 lignes ça devrait être largement suffisant.

Voici un petit exemple d'utilisation du délimiteur d'une TStringList, par défaut la tstringlist créer un item par ligne, mais on peux spécifier son délimiter.
Ici je charge tout le fichier dans source, et j'éclate chaque ligne commençant par 0BLR de source avec comme séClin d'oeil langue arateur TAB.
J'affiche juste le séClin d'oeil langue arateur dans une listbox.

 

code



procedure TForm1.Button1Click(Sender: TObject);
var
  source:TStringList;
  line:TStringList;
  i:integer;
  j:integer;
begin
    source:=TStringList.Create();
    line:=TStringList.Create();
    line.Delimiter:=#9; // Tab character
    source.LoadFromFile('C:\tonfichier.txt');
    for i:=0 to source.Count-1 do
    begin
          if Pos('0BLR',source[i])>0 then
          begin
            line.DelimitedText:=source[i];
            for j:=0 to line.Count-1 do
            begin
                ListBox1.Items.Add(line[j]);
            end;
          end;
    end;
end;     





ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 06/01/13 à 21h26

Bonsoir:

Merci beaucoup tourlourou & ZeuS-[SFX] pour votre aide.

l'exemple montre comment transférer un seul conteur, admettant que je veut transférer de 0BLR a 100 BLR , comment déclarer ceci :

if Pos('0BLR',source[i])>0 then  ,  dans votre exemple .

2/ une fois le transfert de 100 conteur est fait comment filtrer les données: je cherche à les mettre comme suit dans Excel:

counter sec B1 A-B A-BS INT
0BLR         0 2 2 1    (c’est la ligne IPL IN) dans mon premier exemple
0BLR         10 0 0 4    (c’est la ligne DPL IN) dans mon premier exemple 
...
...
...
...
...
...
100BLR
100BLR

Veuillez me donner votre avis sur cette fonction qui efface les lignes non voulu.

Function VireLigne(S,FileName:String):Boolean;
Var f : Tstrings;
j : Longint;
begin
Result:=False;
F:=Tstringlist.Create;
F.LoadFromFile(FileName);
for j:=1 to F.count-1 do
If f[j]=S then
begin
F.Delete(j);
Result:=True;
  Break;
end;
F.SaveToFile(FileName);
F.free;
  end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if VireLigne('ligne a effacer  ','C:\mon fichier .Txt') then

  end.


merci.







ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 11/01/13 à 16h41

Bonjour:

tourlourou & ZeuS-[SFX] , est ce que vous pouriez m'aider sur le problème cité en haut.

merci

tourlourou
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 12/01/13 à 17h41

Ceci me permet d'obtenir ce que tu décris
 

code


procedure TForm1.Button4Click(Sender: TObject);
const
  InFile = 'compteurs.txt';
  OutFile = 'compteurs.csv';
  Delimiter = ';';  // ',' pour un Excel anglophone
type
  TSectionType = ( stUnknown , stIn , stOut ) ;
var
  i,j : integer;
  iFile, oFile : TextFile;
  Line : string;
  SectionType : TSectionType;
  LineExplode: TStringList;
begin
  AssignFile(iFile, InFile);
  Reset(iFile);
  AssignFile(oFile, OutFile);
  Rewrite(oFile);

  LineExplode := TStringList.Create;
  LineExplode.Delimiter := Delimiter; // pour isoler les champs

  SectionType := stUnknown;

  while not EOF(iFile)
  do begin
    ReadLn(iFile, Line);

    if Pos('IN', Line)=1  // 1° niveau : filtrage des sections
    then begin
      SectionType := stIn;
      WriteLn(oFile, Line);
    end
    else begin
      if Pos('OUT', Line)=1
      then SectionType := stOut;
    end;

    if (SectionType = stIn)  // 2° niveau : examen des lignes entre IN et OUT exclus
    and (Trim(Line) > EmptyStr)
    and (Trim(Line) <> 'IN')
    then begin

      // // utilisation d'un StringList pour éclater selon les champs qui feront les cellules dans Excel
      StringReplace(Line, ' ', Delimiter, [rfReplaceAll]);
      LineExplode.DelimitedText := Line;
      j := LineExplode.Count-1;
      for i:=0 to j
      do begin
        if Trim(LineExplode.Strings[j]) = EmptyStr
        then LineExplode.Delete(j);
        Dec(j);
      end;
      // et reformater la ligne
      Line := LineExplode.DelimitedText;

      WriteLn(oFile, Line);
    end;

  end;

  CloseFile(iFile);
  CloseFile(oFile);
  LineExplode.Free;
end;

ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 16/01/13 à 16h30

Bonjour tourlourou :

Je vous remercie beaucoup, c'est un travail de classe.

Le fichier CSV affiche ce qui suit :

IPL
IN
counter sec B1 A-B A-BS INT
0BLR    0  2  2    1 
IN
counter sec B1 A-B A-BS INT
0BLR    10 0  0  4
IN
counter sec B1 A-B A-BS INT
1BLR    0  0  0  4
IN
counter sec B1 A-B A-BS INT
1BLR    1  2  0  0

1/ il y a un décalage le champ SEC ( en gras ) doit être vide dans le fichier CSV créer
2/ je cherche à éliminer IPL et IN (en gras) dans le fichier CSV créer.
3/ ci-dessous ce que je recherche :

counter sec  B1  A-B  A-BS  INT
0BLR        0  2    2      1    (c’est la ligne IPL IN) dans mon premier exemple sans faire apparaitre IPL et IN dans CSV créer
0BLR        10  0    0      4    (c’est la ligne DPL IN) dans mon premier exemple sans faire apparaitre DPL et IN dans CSV créer 
...
...
...
...
...
...
100BLR      0  2    4      1
100BLR      11  56  40    4

Est ce qu'il y a une possibilité de colorer le premier champ dans le CSV créer:

counter sec B1 A-B A-BS INT

Merci pour votre support habituel








ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 24/01/13 à 15h33

Bonjour tourlourou :

Est ce que vous pourriez m'aider sur les points cité en haut.

merci

ZeuS-[SFX]
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 24/01/13 à 16h02

Bonjour ABOUD36,
Je viens de relire tout le sujet, nous ne sommes pas un service gratuit qui travaille à votre place! Avez-vous au moins cherché à comprendre le code fourni par tourlourou ?
Car si tel était le cas vous auriez pu corriger vous même ces quelques erreurs.

Donc essayez de comprendre le code et si il y a des choses que vous ne comprenez pas alors demandez de l'aide, nous nous ferons une joie de vous expliquer.

Pour votre question sur la coloration:
Les fichiers csv sont des fichiers dit "plats" et ne contiennent aucune mise en forme. Donc ce n'est pas possible de faire de la coloration sur votre entête. Il vous faudra donc vous tourner vers un format xls, xlsx, calc ou tout autre format de tableur gérant une mise en forme.





ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 24/01/13 à 17h33

Bonjour ZeuS-[SFX]:

j'ai testé le code, mais j'ai pas pu le corrigé , j'obtient toujour le décalage des nombre ,

J'ai essayé de filtrer la valeur de IN mais elle apparait toujours dans le fichier CSV .

en ce qui concerne votre phrase : nous ne sommes pas un service gratuit qui travaille à votre place! , j'ai solicité votre aide parce que j'en avait besoin .

merci pour tout .

tourlourou
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 24/01/13 à 18h50

 

code


procedure TForm1.Button4Click(Sender: TObject);
const
  InFile = 'compteurs.txt';
  OutFile = 'compteurs.csv';
  Delimiter = ';';  // ',' pour un Excel anglophone
type
  TSectionType = ( stUnknown , stIn , stOut ) ;
var
  i,j : integer;
  iFile, oFile : TextFile;
  Line : string;
  SectionType : TSectionType;
  LineExplode: TStringList;
  DejaEcrit : Boolean;
begin
  AssignFile(iFile, InFile);
  Reset(iFile);
  AssignFile(oFile, OutFile);
  Rewrite(oFile);

  LineExplode := TStringList.Create;
  LineExplode.Delimiter := Delimiter; // pour isoler les champs

  SectionType := stUnknown;
  DejaEcrit := False;

  while not EOF(iFile)
  do begin
    ReadLn(iFile, Line);

    if Pos('IN', Line)=1  // 1° niveau : filtrage des sections
    then begin
      SectionType := stIn;
      // WriteLn(oFile, Line);
    end
    else begin
      if Pos('OUT', Line)=1
      then SectionType := stOut;
    end;

    if (SectionType = stIn)  // 2° niveau : examen des lignes entre IN et OUT exclus
    and (Trim(Line) > EmptyStr)
    and (Trim(Line) <> 'IN')
    then begin

      // // utilisation d'un StringList pour éclater selon les champs qui feront les cellules dans Excel
      StringReplace(Line, ' ', Delimiter, [rfReplaceAll]);
      LineExplode.DelimitedText := Line;
      j := LineExplode.Count-1;
      for i:=0 to j
      do begin
        if Trim(LineExplode.Strings[j]) = EmptyStr
        then LineExplode.Delete(j);
        Dec(j);
      end;
      if LineExplode[0] = 'counter'
      then begin
        LineExplode[0] := LineExplode[0] + ' ' + LineExplode[1];
        LineExplode.Delete(1);
      end;
      // et reformater la ligne
      Line := LineExplode.DelimitedText;

      if Pos('counter', Line)>0
      then begin
        if not DejaEcrit
        then begin
          WriteLn(oFile, Line);
          DejaEcrit := True;
        end;
      end
      else WriteLn(oFile, Line);
    end;

  end;

  CloseFile(iFile);
  CloseFile(oFile);
end;

ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 25/01/13 à 17h43

bONJOUR:

1000 merci tourlourou c'est ce que je chercher , mais le champ counter sec B1 A-B A-BS INT n'aparait pas dans la premiere ligne du fichier csv .

0BLR        0 2 2 1   
0BLR        10 0 0 4   
...
...
...
...
...
...
100BLR
100BLR

je cherche ce qui suit:

counter sec B1 A-B A-BS INT
0BLR        0 2 2 1   
0BLR        10 0 0 4   
...
...
...
...
...
...
100BLR
100BLR

et 1000000 merci pour votre aide


ABOUD36
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 25/01/13 à 19h20

Salut tourlourou :

j'ai fait une petite modification voir en gras le premier filtrage ( if Pos('DPL ', Line)=1  // 1° niveau : filtrage des sections ) , j'ai changé la valeur de IN par DPL :

code


--------------------------------------------------------------------------------
procedure TForm1.Button4Click(Sender: TObject);
const
  InFile = 'compteurs.txt';
  OutFile = 'compteurs.csv';
  Delimiter = ';';  // ',' pour un Excel anglophone
type
  TSectionType = ( stUnknown , stIn , stOut ) ;
var
  i,j : integer;
  iFile, oFile : TextFile;
  Line : string;
  SectionType : TSectionType;
  LineExplode: TStringList;
  DejaEcrit : Boolean;
begin
  AssignFile(iFile, InFile);
  Reset(iFile);
  AssignFile(oFile, OutFile);
  Rewrite(oFile);

  LineExplode := TStringList.Create;
  LineExplode.Delimiter := Delimiter; // pour isoler les champs

  SectionType := stUnknown;
  DejaEcrit := False;

  while not EOF(iFile)
  do begin
    ReadLn(iFile, Line);

    if Pos('DPL ', Line)=1  // 1° niveau : filtrage des sections
    then begin
      SectionType := stIn;
      // WriteLn(oFile, Line);
    end
    else begin
      if Pos('OUT', Line)=1
      then SectionType := stOut;
    end;

    if (SectionType = stIn)  // 2° niveau : examen des lignes entre IN et OUT exclus
    and (Trim(Line) > EmptyStr)
    and (Trim(Line) <> 'IN')
    then begin

      // // utilisation d'un StringList pour éclater selon les champs qui feront les cellules dans Excel
      StringReplace(Line, ' ', Delimiter, [rfReplaceAll]);
      LineExplode.DelimitedText := Line;
      j := LineExplode.Count-1;
      for i:=0 to j
      do begin
        if Trim(LineExplode.Strings[j]) = EmptyStr
        then LineExplode.Delete(j);
        Dec(j);
      end;
      if LineExplode[0] = 'counter'
      then begin
        LineExplode[0] := LineExplode[0] + ' ' + LineExplode[1];
        LineExplode.Delete(1);
      end;
      // et reformater la ligne
      Line := LineExplode.DelimitedText;

      if Pos('counter', Line)>0
      then begin
        if not DejaEcrit
        then begin
          WriteLn(oFile, Line);
          DejaEcrit := True;
        end;
      end
      else WriteLn(oFile, Line);
    end;

  end;

  CloseFile(iFile);
  CloseFile(oFile);
end;

j'ai obtenu ce qui suit :

DPL
counter sec B1 A-B A-BS INT
0BLR        0 2 2 1   
DPL
1BLR        0 0 0 4
DPL
3BLR        0 1 2  3
DPL
4BLR        0 3  4 5
...
...
...
...
...
...
DPL
100BLR    0 4 5 6


Comme cité en haut le champ  counter sec B1 A-B A-BS INT  est apparait une seul fois c'est bien, mais  chaque compteur est réClin d'oeil langue éter une seul fois .j'ai gagné une chose et j'ai perdu une autre, le but toujours est je veux avoir ce qui est listé ci-dessou:

counter sec B1 A-B A-BS INT
0BLR        0 2 2 1   
0BLR        10 0 0 4   
...
...
...
...
...
...
100BLR
100BLR

Merci pour votre support





tourlourou
visiteur
Message Re: lire un fichier texte et mettre le contenu dans excel message: éditerle 25/01/13 à 20h17

avec ce fichier en entrée (établi d'après votre post) :
 

quote


IPL                                         
IN                                           
counter      SEC    B1    A-B  A-BS      INT
0BLR                  0    2      2        1
                                             
OUT                                       
                                             
counter      SEC    B1    C-D  C-DS      INT
0BLR                  0    19    25        1
                                             
DPL                                         
IN                                           
                                             
counter      SEC    B2    A-B  A-BS      INT
0BLR                  10    0      0        4
                                             
OUT                                         
counter      SEC    B2    C-D  C-DS      INT
0BLR                  10    0      0        4 


j'obtiens (sous Lazarus) ce fichier en sortie :
 

quote


counter SEC;B1;A-B;A-BS;INT
0BLR;0;2;2;1
0BLR;10;0;0;4

Index > Forum général > lire un fichier texte et mettre le contenu dans excelNouveau post - Répondre
 page 1 sur 1