2017-12-29 87 views
2

現在、私はホスティングの技術サポートに取り組んでいますbussiness、primarly cPanelを使用しています。また、私はコード化する方法を学んでいます(Cのみを使用しています)。問題は、cPanelによって作成されたcsvファイルを解析することに問題があることです。ドメインのすべての情報(IP、ドメイン名、ディスク内の空き領域など)を含むリストです。今まで、私が成功したファイル(.txt、.csv、.binなど)をすべて解析したとき、それらのファイルにはすべて、新しい行が__ endoflineで区切られていましたか? (Cでは\ n、他にどのように呼ばれているのか分かりません:P)、特にこのファイルでは、次のように ",,,,"で区切られています。Cでの.csvファイルの解析に関する問題は、 ",,,,"が " n"と等しいことをプログラムに伝える方法がわかりません

domain_name、ip quota ,,,, domain_name、ip、quota ,,,, domain_name、ip、quota ,,,, ...

そして、私のプログラムに ",,,," 「\ n」に等しい。今のところ私はファイル内の最初のドメインだけを読むことができますが、それが返される唯一のレコードです。次のようにコードは、これまでのところです:

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); 
} 

コード上のコメントのカップル:私はすでにテストされたメモリ内のファイルをロードするためのArrayListを使用していますので、私はそれが正しく動作していることを知っています。関数constructor()とabrir_archivo()は問題ではありません(私はそれらを他のプロキシで数回使っていますが、もちろん、コンストラクタ()関数は現在使用している特定の構造に合うように調整されています) 。

正規表現についてよく分かりませんが、最初の "、"が表示されるまで、私は今使用しているファイルを読み込んでいますが、それだけです。

ご協力いただきますようお願い申し上げます。

ありがとう、悪い英語をお詫び申し上げます。

+0

'%[^ \ n] \ n'を' [^、] ,,,, 'に変更するとどうなりますか? –

+0

すべてのコンバージョンは少なくとも1文字に一致する必要があります。書式文字列中の空白だけがデータ内のオプションの空白を示します。これは、変換指定が空白をスキップしない場合( '%c '、'%[...] 'およ​​び'%n'とにかく先頭の空白はスキップします)。したがって、CSV行の末尾にある ',,,, 'は'%[^、]、%[^]、%[^]、%[^、]、 '(そこには4番目にマッチしたカンマの後に別の '%[^、]'があるかもしれません。この点については、 'scanf()'ファミリと 'strtok()'のどちらも良いアイデアではないことを認識しています。 –

答えて

0

個々のフィールドを読み取ろうとします。ストリームに複数のカンマがある場合、スキャンセット%199[^,]は失敗します。残りのカンマを%[,]で読み、フィールドを処理します。

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); 
} 
関連する問題