an example is pretty huge...and it'll referred to a specific file. In terms of concept you had to:
1-open the csv file (FILE.Open FB) --> get header of file (file.CAA.HANDLE)
2-using the header you read the 1st row (FILE.Read FB) https://help.codesys.com/webapp/VIPLMVOpanJfjqQXFKWGQlzGjxw%2FOpen;product=CAA%20File;version=3.5.17.0
3-you have to update the header to the last character read (File.GetPos --> File.SetPos)
4-read the 2nd row (FILE.Read FB)
......
x - close the file (FILE.Close)
I suggest to read Codesys help and try to read a small piece of a csv, then you'll can proceed to write something into csv
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
For read, my code is limit to 255 butes. How read more ?
PROGRAMCHARGER_LISTE_OP_CSVVARHfile:DWORD;//Adressedufichieraveclalistedesnomsd'opérateurs FilePathAndName: STRING; //Caractère de fin de ligne et retour chariot CRLF: STRING(2):='$R$N'; //Fonction ouvrir le fichier fopen : FILE.Open; //Fonction lire le fichier fread: FILE.Read; //Fonction fermer le fichier fclose: file.Close; //Fonction obtenir la taille du fichier en bytes fgetsize: FILE.GetSize; //Contenu du fichier limité à 255 butes ou caractères sFileString: STRING(255):=''; //Numéro action en cours: 1=ouvrir csv , 2=taille du fichier, 5= lire csv, 9=Lecture réussit: transfert du tampon vers la table, 10= fermer le fichier Num_Etape: INT; //Extraction des noms en cours En_Cours: BOOL; //Liste des nom d'opérateurListe_Op_Buffer:ARRAY[1..50]OFSTRING(40);//LongueurdelachainedecaractèresrécupéréedansleCSVLongueur_Chaine:INT;//LongueurdunomextraitLongueur_Nom:INT;//Positionducaractère";"Position_separateur:INT;//Numérodanslatabledunomdel'opérateur Ligne_Tab_Op: INT; //Taille du CSV en bytes déterminé par fonction fgetsize Taille_Csv: CAA.SIZE; //Nombre maxi de nom dans la liste Maxi_Liste: INT; //Nombre de butes lu par fonction fread fread_szSize: CAA.SIZE;END_VAR(*Charger la liste des nom d'opérateurs*)(*PARAMETRES*)FilePathAndName:='/home/partage_pi/operateurs.csv';Maxi_Liste:=50;(*FONCTIONS*)//FonctionouvertureCSVfopen(xExecute:=(Num_Etape=1),xDone=>,xBusy=>,xError=>,sFileName:=FilePathAndName,eFileMode:=FILE.MODE.MREAD,xExclusive:=,eError=>,hFile=>);//Fonctiondéterminerlatailleducsvfgetsize(xExecute:=(Num_Etape=2),xDone=>,xBusy=>,xError=>,sFileName:=FilePathAndName,eError=>,szSize=>);//FonctionlectureCSVfread(xExecute:=(Num_Etape=5),xAbort:=FALSE,udiTimeOut:=100000,xDone=>,xBusy=>,xError=>,xAborted=>,hFile:=hFile,pBuffer:=ADR(sFileString),szBuffer:=Taille_Csv,eError=>,szSize=>fread_szSize,);//FonctionfermetureCSVfclose(xExecute:=(Num_Etape=10),xDone=>,xBusy=>,xError=>,hFile:=Hfile,eError=>);(*GESTION*)IFGVL.CHARGER_LISTE_OP=TRUETHEN//InitIFEn_cours=FALSETHEN//EffacerlatabletamponFORLigne_Tab_Op:=1TOMaxi_ListeDOListe_Op_Buffer[Ligne_Tab_Op]:='';END_FORNum_Etape:=1;sFileString:='';Ligne_Tab_Op:=1;fread_szSize:=0;Taille_Csv:=0;Hfile:=0;fopen.xExecute:=FALSE;fgetsize.xExecute:=FALSE;fread.xExecute:=FALSE;En_Cours:=TRUE;END_IFCASENum_EtapeOF0:En_Cours:=FALSE;GVL.CHARGER_LISTE_OP:=FALSE;1:(*Ouvrirlefichier*)IFfopen.xDoneTHENHfile:=fopen.hFile;Num_Etape:=2;END_IF//ErreurIFfopen.xErrorANDfopen.eError<>5104THENNum_Etape:=10;END_IF//Lefichiern'existe pas IF fopen.eError = 5104 THEN Num_Etape:=10; END_IF 2: (*Taille du fichier fichier*) IF fgetsize.xDone THEN Taille_Csv:=fgetsize.szSize; Num_Etape:=5; END_IF //Erreur IF fgetsize.xError THEN Num_Etape:=10; END_IF 5:(*Lire 255 bytes*) IF fread.xDone THEN Longueur_Chaine := LEN( sFileString ); IF Longueur_Chaine<>0 THEN WHILE sFileString<>'' DO //Chercher le retour à la ligne Position_separateur := FIND( sFileString, CRLF ); //Récupérer le nom contenu avant le retour à la ligne et le stocker dans la table tampon IF Position_separateur > 1 THEN Liste_Op_Buffer[Ligne_Tab_Op] := LEFT( sFileString, Position_separateur-1); ELSE Liste_Op_Buffer[Ligne_Tab_Op] := sFileString; sFileString:=''; END_IF Longueur_Nom := LEN(Liste_Op_Buffer[Ligne_Tab_Op]); //Enlever le nom extrait de la chaine de caractère sFileString:= DELETE( sFileString , Position_separateur + 1 , 1 ); Longueur_Chaine := LEN( sFileString ); Ligne_Tab_Op:=Ligne_Tab_Op+1; END_WHILE END_IF Num_Etape:=9; END_IF IF fread.xError THEN Num_Etape:=10; END_IF 9:(*Lecture fichier réussit: transfert de la table tampon dans la table des noms d'opérateurs*)FORLigne_Tab_Op:=1TOMaxi_ListeDOGVL.LISTE_OPERATEURS[Ligne_Tab_Op]:=Liste_Op_Buffer[Ligne_Tab_Op];END_FORNum_Etape:=10;10:(*Fermerlefichier*)fclose(xExecute:=TRUE);IFfclose.xErrorTHEN;END_IFIFfclose.xDoneTHENNum_Etape:=0;END_IFEND_CASEELSEEn_cours:=FALSE;Num_Etape:=0;END_IF
I don't understand how to use getpos and setpos: what is position ? Position of byte ? Position on memory ?
Thanks for your help.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi,
I want to read and write CSV. What is the best way to do it for free ? And have you example ?
Thank for your help.
Try searching Forge;
https://forge.codesys.com/forge/talk/search/?q=CSV
Thank you, but I ask question because I didn't find recent solution with example.
Last edit: galexis 2021-06-01
an example is pretty huge...and it'll referred to a specific file. In terms of concept you had to:
1-open the csv file (FILE.Open FB) --> get header of file (file.CAA.HANDLE)
2-using the header you read the 1st row (FILE.Read FB)
https://help.codesys.com/webapp/VIPLMVOpanJfjqQXFKWGQlzGjxw%2FOpen;product=CAA%20File;version=3.5.17.0
3-you have to update the header to the last character read (File.GetPos --> File.SetPos)
4-read the 2nd row (FILE.Read FB)
......
x - close the file (FILE.Close)
I suggest to read Codesys help and try to read a small piece of a csv, then you'll can proceed to write something into csv
sample :
https://forge.codesys.com/prj/csv-write-read/home/CSV_Write_Read/
Last edit: wollvieh 2021-06-10
For read, my code is limit to 255 butes. How read more ?
I don't understand how to use getpos and setpos: what is position ? Position of byte ? Position on memory ?
Thanks for your help.