OLEDB로 텍스트 파일을 읽을 때 CR을 올바르게 처리하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1809272

문제

탭 구분 된 텍스트 파일이 있습니다. 스키마를 만들었습니다.

[MY_FILE.TAB]
Format=TabDelimited
ColNameHeader=False
Col1=id Short
Col2=data Text

이것은 내가 읽는 데 사용하는 코드입니다 (C#).

using (var connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\FolderToData\;Extended Properties='text;FMT=delimited'"))
{
  using (var command = new OleDbCommand("SELECT * FROM MY_FILE.TAB", connection))
  {
    var table = new DataTable();
    using (var adapter = new OleDbDataAdapter(command)
    {
      adapter.Fill(table);
    }
  }
}

한 가지를 제외하고는 모든 것이 잘 작동합니다. 텍스트 파일의 데이터에는 캐리지 리턴 [CR]이 포함되어 있습니다. 레코드 자체는 캐리지 리턴 라인 피드 [CR] [LF]로 분리됩니다. 불행히도, OLEDB / MicrosoftJet (또는이 파일을 구문 분석하는 것)은 동일하게 ([CR], [CRLF])를 모두 취급합니다.

my_file.tab의 예 (숫자와 텍스트 사이에 탭이 있어야 함) :

1   One[CR][LF]
2   Two[CR][LF]
3   Th[CR]
ree[CR][LF]
4   Four[CR][LF]

4 대신 DataTable에서 5 개 (오르포드 된) 행을 제공합니다.

내가 필요한 것은 :

1   "One"
2   "Two"
3   "Th\nree"
4   "Four2

그러나 나는 얻는다 :

1    "One"
2    "Two"
3    "Th"
null null
4    "Four"

"Ree"는 int32로 변환 될 수 없으므로 네 번째 줄의 첫 번째 Colum은 NULL입니다.

cr] [lf]와 다른 [cr]을 처리하도록 OLEDB를 어떻게 구성 할 수 있습니까? 아니면 다른 아이디어가 있습니까?

도움이 되었습니까?

해결책

나는 당신이 이것을 직접 할 수 있도록 OLEDB를 재구성 할 수 있다고 생각하지 않습니다.

대안적인 접근 방식은 TexTreader와 TextWriter를 사용하여 파일을 임시 파일로 처리하고 CR 단독을 특수 탈출 시퀀스로 스캔하고 교체하는 것입니다. 그런 다음 OLEDB를 사용 하여이 대체 임시 파일을 읽으십시오. 마지막으로 특수 탈출 시퀀스를 CR로 교체하십시오.

다른 팁

문자열로 파일 내용을 읽는 것이 쉽지 않습니까? Environment.NewLine 또는 \r\n, 각 라인에 대한 배열을 얻을 수 있으며, 더 나눌 수 있습니다. tab?

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