2010-12-16 4 views
3

3, asdf, *#, 1212.3과 같은 쉼표로 구분 된 값 목록이 주어지면 쉼표를 제외하고 각 값을 추출하고 싶습니다. 따라서 [3, "asdf", "*#", 1212.3]과 같은 값 목록을 갖게됩니다 (텍스트 표현이 아님). 그런 식으로,하지만 '히트'의 배열로). 어떻게하면 좋을까요? 난 당신이 D 프로그래밍 언어를 사용하고 참조쉼표로 구분 된 목록에서 값 추출

@anArray = split(',', "A,B,C,D,E,F,G"); 
+1

어떤 프로그래밍 언어로? – Asaph

+1

D 프로그래밍 언어입니다. –

답변

2

먼저 CSV 파일을 다루는 경우 regex 나 자체 파서를 사용하지 마십시오. 기본적으로 사물이 단순하다고 생각하면 실제로는 그렇지 않습니다. Stop Rolling Your Own CSV Parser.

다음으로 배열 ([3, "asdf", "* #", 1212.3])을 갖고 싶다고 말합니다. 이것은 유형을 혼합하는 것으로 보이며 정적 언어로 수행 될 수 없습니다. 궁극적으로 std.variant를 사용하더라도 매우 비효율적입니다. 데이터가 진정으로 일부 문자 정의 세트로 구분하고, 당신은 "(분할을 사용할 수있는 새로운 라인 레코드로 분리되지 않은 경우 지금

try { 
    auto data = to!double(parsedValue); 
    auto data2 = to!int(data); 
    if(data == data2) 
     returnThis = Variant(data2); 
    else 
     returnThis = Variant(data); 
} catch(ConvException ce) { } 

: 각각의 분석 값에 대해 당신과 같은 코드를 것 , ") std.algorithm에서. 그렇지 않으면 CSV 파서를 사용하십시오. 표준을 따르고 싶지 않으면 파서를 감싸서 원하는 데이터를 얻으십시오. 귀하의 예제에서는 CSV 형식으로 무시할 수없는 공백이 있으므로 출력에서 ​​strip()을 호출하십시오.

the article I linked에서 사람들은 가장 단순한 형태로 파서를 작성하고 더 복잡한 경우는 처리하지 않는다는 사실을 언급합니다. 그래서 당신이 CSV 파서를 찾을 때 당신은 그것을 자르지 않는 많은 것을 발견 할 것입니다. 필자 자신의 파서를 작성하는 것은 내가 말하는 모든 유효한 CSV 파일을 처리하는 것입니다.

다행히도 내가 직접 작성한대로 CSV Parser for D을 작성하지 않아도됩니다. 오류 검사가 현재 완료되지 않았으므로 구문 분석을 수정하고 계속 진행할 수있는 문제를보고하는 가장 좋은 방법을 모르겠습니다. 사용 예제는 unittest 블록에서 찾을 수 있습니다. 당신은 너무 구조체를 구문 분석 할 수 있습니다 :

struct MyData { 
    int a; 
    string b; 
    string c; 
    double d 
} 

foreach(data; csv.csv!MyData(str)) // I think I'll need to change the module/function name 
    //... 
1

perl에 당신이 뭔가를 할 수 있습니다. 다음은 CSV parser for D에 대한 링크입니다.

+0

일부 CSV 필드에 쉼표가 있으면 어떻게됩니까? 예. CSV에서 완전히 합법적 인 "my, first, field", "my, second, field", "my, third, field"입니다. – Asaph

+0

어쨌든 OP는 D 프로그래밍 언어를 사용하고 있습니다. 따라서 perl 응답은 관련이 없습니다. – Asaph

+0

@Asaph 제 제안에 대해 매우 유감스럽게 생각합니다. D 언어에 관한 설명이 작성된 것처럼 제 게시물을 작성한 것처럼 보입니다. 어떤 경우에도 필드에 쉼표가 있으면 모든 필드가 따옴표로 묶여 있지 않으면 CSV 파서가 문제가 있다고 생각합니다.이 경우 구문 분석 할 때 따옴표를 계산해야합니다. – Bnjmn

5

:

+0

의견을 듣는 데별로 도움이되지 않아서 미안합니다. 그러나 unittest 섹션은 사용 방법에 대한 좋은 예를 제시해야합니다. 또한 이것은 아마도 더 나은 URL 일 것입니다. https://github.com/he-the-great/JPDLibs/tree/csv –

+0

@he_the_great : 내가 제안한 새로운 링크를 업데이트했습니다. 고맙습니다. – Asaph

0

(?:,|\s+)?([^ ,]+)해야합니다. 쉼표 또는 공백을 건너 뛰고 쉼표 또는 공백 이외에는 아무 것도 선택하지 않습니다. 취향에 맞게 수정하십시오.

+0

간단한 CSV 형식이라도 너무 단순합니다. 자세한 내용은 @ Bnjmn 's의 의견을 참조하십시오. – Asaph

관련 문제