wie ließt mql ein CSV-File?

Einloggen oder registrieren, um einen Kommentar zu schreiben
Bayne
745
Bayne  
"Liest aus der Datei des Typs CSV die Zeile von der laufenden Position bis zum Begrenzer (oder bis zum Ende der Textzeile) und wandelt die gelesene Zeile in den Wert des Typs double um."


Er ließt also nur bis zum begrenzer (delimiter in diesem Fall ein ",").

Um die ganze zeile (bestehend aus 4 werten) zu lesen, muss ich FileReadNumber(Filehandle) also 4 mal aufrufen? (und nur die werte die ich brauche rauspicken?

etwa nach dem schema ?:


       
double wert_eins[]; ArrayResize(wert_eins,FileRows);
double wert_zwei[]; ArrayResize(wert_zwei,FileRows);
double wert_drei[]; ArrayResize(wert_drei,FileRows);
double wert_vier[]; ArrayResize(wert_vier,FileRows);
                                                                       //Beispielzeilen etwa immer so aus:    wert_eins, wert_zwei, wert_drei, wert_vier

while(FileIsEnding(file_handle)==false)
        {  
        double wert_eins[i] = double  FileReadNumber(file_handle);
        double wert_eins[i] = double  FileReadNumber(file_handle);
        double wert_eins[i] = double  FileReadNumber(file_handle);
        double wert_eins[i] = double  FileReadNumber(file_handle);
        }
amando
1735
amando  
Bayne:


Er ließt also nur bis zum begrenzer (delimiter in diesem Fall ein ",").

Um die ganze zeile (bestehend aus 4 werten) zu lesen, muss ich FileReadNumber(Filehandle) also 4 mal aufrufen? (und nur die werte die ich brauche rauspicken?

etwa nach dem schema ?:


       

Das file read und write ist bei mql eine eigene sache, aber du liest immer nur wert eins

Carl Schreiber
Moderator
8151
Carl Schreiber  

Wenn ich ein csv-Datei lesen will, gehe ich so vor:

  1. Ich lese die Datei ganz ein ganz ein: zB:
    int nL,i,sz,hdl = FileOpen(fNameMag,FILE_READ|FILE_BIN|FILE_COMMON);
    sz  = (int)FileSize(hdl);
    string lines[],cell[],all = FileReadString(hdl,sz); // read file totally
  2. Dann splitte ich all in die Zeilen:
    ushort SepLine = StringGetCharacter("\n",0),
           SepItem = StringGetCharacter(";",0);
    nL = i  = StringSplit(all,SepLine,lines); // split file in lines
  3. Dann splitte ich die Zeilen in Zellen:
    while(i-->0) {
          nC = StringSplit(lines[i],SepItem,cell);
          ...
          while(nC-->0) {
                int n = (int)StringToInteger(cell[nC]);
          }
    }
      
Das bietet MQL.
    Chris70
    122
    Chris70  
    vielleicht auch eine Überlegung wert: ob es mit .bin-File und FileWriteArray / FileReadArray nicht einfacher ginge(?)
    Bayne
    745
    Bayne  
    Carl Schreiber:

    Wenn ich ein csv-Datei lesen will, gehe ich so vor:

    1. Ich lese die Datei ganz ein ganz ein: zB:
    2. Dann splitte ich all in die Zeilen:
    3. Dann splitte ich die Zeilen in Zellen:
        
    Das bietet MQL.

      1.was befindet sich in den beiden stringarrays lines[],cell[] und dem string all ? (anscheinend alle daten, aber wie?) alles ein durchgehender string?

      2. das zweite verstehe ich: wir splitten alles in Zeilen durch den Zeilenseperator SepLine und in lines[] ist die jeweilige zeile als ein string und erhalten die anzahl an substrings, aber warum setzt du nL = i?

      3. die whileschleifen sind pseudocode und gleichzusetzen mit for(int substring =i; substring>0;substring--) und for(int cell =nC;cell>0;cell--) stimmts? oder funktioniert diese syntax wirklich so? (wenn das stimmt splitten wir im ersten Loop den Zeilenstring in seine Zellen und transferiere im zweiten Loop diese jeweiligen Zellen zurück in den typ den wir haben wollen).


      okay... habs verstanden, danke dir für das Beispiel :)


      Das ganze können wir dann in eine Matrix einsetzen mit den gleichen loopiterationen -> so z.B.

      //(vor dem loop deklariert) 
      int matrix[][nC]; ArrayResize(matrix, i); 
      
      while(i-->0) {
            nC = StringSplit(lines[i],SepItem,cell);
            ...
            while(nC-->0) {
                  int n = (int)StringToInteger(cell[nC]);
                      matrix[i][nc] =n;
            }
      }

      müsste so stimmen.

       
      Carl Schreiber
      Moderator
      8151
      Carl Schreiber  

      add 1: all ist ein string mit allem, lines[] kriegt alle Zeilen und cell[] alle Zellen einer Zeile, die Reihenfolge ist die der Datei.

      add 2: i wird (ohne ein break) auf -1 runtergezählt, ich benötige aber uU. noch die ursprüngliche Anzahl der Zeilen

      add 3: while funzt - lies es nach.

      Christian
      2818
      Christian  

      Da hat sich schon jemand Gedanken gemacht.

      https://www.mql5.com/en/code/24777

      CSV file reader for MQL5
      CSV file reader for MQL5
      • www.mql5.com
      1. Set up an array of column descriptions  in an MqlParam array. 2. Open the file with the Open() function 2a. When the file has a header and your are not interested in the contents of the headerline skip it with Readline(void).   3. With ReadLine(MqlParam arr) a MqlParam array is filled with values of one text line of the CSV file.  ...
      Einloggen oder registrieren, um einen Kommentar zu schreiben