2017-12-29 24 views
2

Ich arbeite derzeit in der technischen Unterstützung für ein Hosting bussiness, mit primarly cPanel. Außerdem lerne ich, wie man programmiert (nur C für den Moment verwendend). Die Sache ist, dass ich Probleme habe, eine csv-Datei zu analysieren, die von cPanel erstellt wird, eine Liste mit allen Informationen der Domänen (IP, Domänenname, verfügbarer Speicherplatz auf der Festplatte und so weiter). Bis jetzt haben alle Dateien, die ich erfolgreich geparst habe (.txt, .csv, .bin, etc) alle haben jede neue Zeile durch eine endofline getrennt? (\ n in C, ich weiß nicht, wie sonst heißt: P), aber in dieser Datei wird das Ende einer Zeile durch ein ",,,, wie folgt getrennt:Probleme mit dem Parsen einer .csv-Datei in C, ich weiß nicht, wie ich meinem Programm sagen kann, dass ein ",,,, ist gleich einem" n "

domain_name, ip , quota ,,,, domainname, ip, quota ,,,, domainname, ip, quota ,,,, ...

Und ich weiß nicht, wie ich meinem Programm sagen kann, dass ein ,, ,,,, ist gleich einem "\ n". Bisher kann ich nur die erste Domain in der Datei lesen, aber das ist der einzige Datensatz, der zurückgegeben wird. Der Code ist so weit wie folgt:

void parsear_archivo(ArrayList* lista) 
{ 
    FILE* archivo = abrir_archivo("archivo.csv"); 
    eDominio* aux; 
    char aux_ip[100]; 
    char aux_nombre_dominio[200]; 
    char aux_user_name[50]; 
    char aux_email[100]; 
    char aux_quota[100]; 
    char aux_server[100]; 
    rewind(archivo); 
    fscanf(archivo, "%[^,],%[^,],%[^,],%[^\n]\n", aux_nombre_dominio, aux_ip, aux_email,aux_server); 
    while (!feof(archivo)) 
    { 
     aux = constructor(); 
     fscanf(archivo, "%[^,],%[^,],%[^,],%[^\n]\n", aux_nombre_dominio, aux_ip, aux_email,aux_server); 
     if (aux != NULL) 
     { 
      strcpy(aux->ip, aux_ip); 
      strcpy(aux->quota, aux_quota); 
      strcpy(aux->server, aux_server); 
      strcpy(aux->email, aux_email); 
      strcpy(aux->nombre_dominio, aux_nombre_dominio); 
     } 
     lista->add(lista, aux); 
    } 
    fclose(archivo); 
} 

Ein paar Kommentare zu dem Code: Ich bin eine Arraylist mit der Datei in dem Speicher zu laden, das wurde bereits getestet, so dass ich weiß, dass es richtig funktioniert; Die Funktionen constructor() und abrir_archivo() sind hier nicht das Problem (ich habe sie mehrmals in anderen Projekten verwendet, ohne Probleme - die Funktion constructor() ist natürlich auf die spezifische Struktur zugeschnitten, die ich gerade verwende) .

Ich weiß nicht viel über reguläre Ausdrücke, ich weiß, dass diejenigen, die ich gerade benutze, in der Datei bis zum ersten "," lesen, aber das ist nur darüber.

Jede Hilfe wird sehr geschätzt!

Danke und Entschuldigung für das schlechte Englisch.

+0

Was würde passieren, wenn Sie '% [^ \ n] \ n' in' [^,] ,,,, 'ändern? –

+0

Alle Konvertierungen müssen mit mindestens einem Zeichen übereinstimmen. Nur Leerraum in einer Formatzeichenfolge weist auf optionalen Leerraum in den Daten hin, und das ist nur relevant, wenn die Konvertierungsspezifikation Leerraum sowieso nicht überspringt (das wären "% c", "% [...]" und "% n" alles andere überspringt sowieso führenden Leerraum. Sie können also '',' am Ende einer CSV-Zeile nicht mit Konvertierungen wie '% [^,],% [^,],% [^,],% [^,],' wo es ein anderes '% [^,]' nach dem vierten passenden Komma geben könnte oder auch nicht. Irgendwo an diesem Punkt merkt man, dass weder die 'scanf()' Familie noch 'strtok()' eine gute Idee ist. –

Antwort

0

Versuchen Sie einzelne Felder zu lesen. Wenn sich mehr als ein Komma im Stream befindet, schlägt der Scanset %199[^,] fehl. Lies die restlichen Kommas mit %[,] und bearbeite die Felder.

void parsear_archivo(ArrayList* lista) 
{ 
    FILE* archivo = abrir_archivo("archivo.csv"); 
    eDominio* aux; 
    char aux_ip[100]; 
    char temp[200]; 
    char aux_nombre_dominio[200]; 
    char aux_user_name[50]; 
    char aux_email[100]; 
    char aux_quota[100]; 
    char aux_server[100]; 
    int each = 0; 
    rewind(archivo); 
    do 
    { 
     each = 0; 
     while (1 == (result = fscanf(archivo, "%199[^,],", temp))) { 
      if (0 == each) { 
       sscanf (temp, "%199[^,]" aux_nombre_dominio); 
      } 
      if (1 == each) { 
       sscanf (temp, "%99[^,]", aux_ip); 
      } 
      if (2 == each) { 
       sscanf (temp, "%99[^,]", aux_email); 
      } 
      if (3 == each) { 
       sscanf (temp, "%99[^,]", aux_server); 
      } 
      each++; 
     } 
     result = fscanf(archivo, "%199[,]" temp);//scan , 
     if (4 == each) { 
      aux = constructor(); 
      if (aux != NULL) 
      { 
       strcpy(aux->ip, aux_ip); 
       strcpy(aux->quota, aux_quota); 
       strcpy(aux->server, aux_server); 
       strcpy(aux->email, aux_email); 
       strcpy(aux->nombre_dominio, aux_nombre_dominio); 
      } 
      lista->add(lista, aux); 
     } 
    } while (1 == result && NULL != aux); 
    fclose(archivo); 
} 
Verwandte Themen