2017-12-29 63 views
2

같다 내 프로그램을 이야기하는 방법을 모른다 bussiness, primarly cPanel을 사용합니다. 또한, 나는 코딩하는 법을 배우고있다. 문제는 도메인의 모든 정보 (IP, 도메인 이름, 디스크에있는 avaible 등)가있는 목록 인 cPanel에 의해 생성 된 csv 파일을 구문 분석하는 데 문제가 있다는 것입니다. 지금까지 필자가 성공적으로 파싱 한 모든 파일 (.txt, .csv, .bin 등)은 모두 새로운 줄이 Â endofline으로 구분되어 있습니다. (C에서 \ n, 어떻게 호출되는지는 모르지만 : P),이 특정 파일에서 한 줄의 끝은 다음과 같이 ",,,,"로 구분됩니다.문제, 나는 ",,,,"나는 현재 호스팅을위한 기술 지원에서 일하고 있어요 " n"

domain_name, ip 할당량 ,,,, DOMAIN_NAME, IP, 할당량 ,,,, DOMAIN_NAME, IP, 할당량 ,,,, ...

그리고 나는 내 프로그램을 말하는 방법을 모르는는 ",,,," "\ 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를 사용하고 있습니다; 함수 생성자()와 abrir_archivo()가 여기에 문제가되지 않습니다는 (I 생성자() 함수가 나는 현재 일 아민있어 특정 구조에 맞게 맞춘, - 물론 문제없이 그들에게 다른 사람 proyects에서 여러 번 사용) . 나는 정규 표현식에 대해 잘 모르는

, 나는 첫 번째 ","이 나타날 때까지 내가 사용하는 사람이 지금 파일에서 읽어 알고 있지만, 그것은 단지 그것에 대해입니다.

도움이 될 것입니다.

나쁜 영어에 대한 당신과 유감을 감사드립니다.

+0

'% [^ \ n] \ n'을'[^,] ,,,, '으로 변경하면 어떻게 될까요? –

+0

모든 전환은 하나 이상의 문자와 일치해야합니다. 형식 문자열의 공백 만 데이터의 선택적 공백을 나타냅니다. 변환 지정이 공백을 건너 뛰지 않으면 ('% c', '% [...]'및 '% n'이 될 수 있습니다. 어쨌든 모든 공백은 건너 뜁니다.) 따라서 CSV 라인의 끝에있는',,,, '을'% [^,], % [^], % [^], % [^,],'(와 같이 변환 할 수 없습니다. 여기서 네 번째로 매치 된 쉼표 뒤에 또 다른'% [^,]'가있을 수도 있고 없을 수도 있습니다. 이 점에 대해서는'scanf()'와'strtok()'도 좋은 생각이 아니라는 것을 알고 있습니다. –

답변

0

개별 필드를 읽어보십시오. 스트림에 둘 이상의 쉼표가 있으면 scanset %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); 
}