문제

구분된 문자열을 구문 분석하는 중입니다.

알파벳

그러나 이는 매우 간단한 예이므로 구분된 데이터를 구문 분석하는 것이 복잡해질 수 있습니다.예를 들어

1,"간단한 알고리즘은 실패합니다",참

순진한 문자열을 날려버릴 것입니다. 구현을 비트로 분할합니다.구분된 텍스트를 구문 분석하는 데 상대적으로 안전한 솔루션을 제공하는 자유롭게 사용/도용/복사하여 붙여넣을 수 있는 것이 있습니까?.NET, 플록스.

업데이트: 나는 그와 함께 가기로 결정했다. TextFieldParser, 이는 Microsoft.VisualBasic.DLL에 숨겨져 있는 VB.NET의 유용한 기능 중 일부입니다.

도움이 되었습니까?

해결책

나는 이것을 파일에서 읽는 데 사용합니다.

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

나는 여기 누군가가 이것을 변환하여 메모리에 있는 문자열을 파싱할 수 있다고 확신합니다.

다른 팁

매우 포괄적인 라이브러리는 여기에서 찾을 수 있습니다: FileHelpers

어떤 프레임워크도 알지 못하지만 간단한 상태 시스템은 작동합니다.

  • 상태 1:" 또는 a를 칠 때까지 모든 문자를 읽습니다.
    • "의 경우:상태 2로 이동
    • 의 경우:상태 3으로 이동
    • 파일의 끝인 경우:상태 4로 이동
  • 상태 2:"를 칠 때까지 모든 문자를 읽으십시오.
    • "의 경우:상태 1로 이동
    • 파일의 끝인 경우:상태 4로 이동하거나 종료되지 않은 문자열로 인해 오류를 알립니다.
  • 상태 3:현재 버퍼를 출력 배열에 추가하고 커서를 뒤로 이동한 다음 다시 상태 1로 이동합니다.
  • 상태 4:이것이 최종 상태이며, 출력 배열을 반환하는 것 외에는 아무것도 하지 않습니다.

와 같은

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

여기에 몇 가지 좋은 답변이 있습니다. 인용된 섹션을 무시하고 문자열 분할

질문을 좀 더 정확한 표현으로 바꾸고 싶을 수도 있습니다(예: .NET에서 CSV 데이터를 구문 분석하는 데 사용할 수 있는 코드 조각 또는 라이브러리?).

뻔뻔한 플러그를 하기 위해 한동안 라이브러리라는 작업을 해왔습니다. 포텔로 (형식화된 텍스트 로더)는 구분 기호, 위치 또는 정규식을 기반으로 많은 양의 텍스트를 빠르게 구문 분석하는 데 사용합니다.빠른 문자열의 경우 과잉이지만 로그나 대량 작업을 수행하는 경우에는 꼭 필요한 것일 수 있습니다.이는 SQL*Loader와 유사한 제어 파일 모델에서 작동합니다(이에 영감을 준 것임).

안 하는 것보다는 늦는 것이 낫습니다(SO의 완성도를 높이세요):

http://www.codeproject.com/KB/database/CsvReader.aspx

이것은 하나의 규칙입니다.

GJ

나는 일반 프레임워크가 다음 두 가지를 지정해야 한다고 생각합니다.1.구분 문자는 무엇입니까?2.어떤 조건에서 해당 문자가 계산되지 않습니까(예: 따옴표 사이에 있는 경우).

이런 작업을 수행해야 할 때마다 사용자 정의 논리를 작성하는 것이 더 나을 수도 있다고 생각합니다.

가장 간단한 방법은 문자열을 char 배열로 분할하고 문자열 결정자와 분할 문자를 찾는 것입니다.

단위 테스트는 상대적으로 쉬워야 합니다.

기본 .Spilt 메서드와 유사한 확장 메서드로 래핑할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top