OleDBでテキストファイルを読み取るときにCRを正しく処理する方法
-
05-07-2019 - |
質問
タブ区切りのテキストファイルがあります。次のようにSchema.iniを作成しました:
[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);
}
}
}
1つを除いて、すべて正常に動作します。テキストファイルのデータには、キャリッジリターン[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に変換できないため、4行目の最初の列はnullです。
[CR] [LF]とは異なる[CR]を扱うようにOleDBを構成するにはどうすればよいですか?または他のアイデア?
解決
OLEDBを再構成してこれを直接実行できるとは思わない。
別のアプローチとしては、TextReaderとTextWriterを使用してファイルを一時ファイルに処理し、CRのみをスキャンして特別なエスケープシーケンスに置き換えます。次に、OLEDBを使用して、この置換一時ファイルを読み取ります。最後に、特別なエスケープシーケンスをCRに戻します。
他のヒント
文字列でファイルの内容を読むのは簡単ではありませんか? Environment.NewLine
または \ r \ n
で分割します。各行について、 tab
でさらに分割できますか?
所属していません StackOverflow