【问题标题】:How do I correctly handle CR when reading text files with OleDB使用 OleDB 读取文本文件时如何正确处理 CR
【发布时间】:2009-11-27 15:06:39
【问题描述】:

我有制表符分隔的文本文件。我像这样创建了一个 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);
    }
  }
}

一切正常,除了一件事。文本文件中的数据包含回车 [CR]。记录本身由回车换行符 [CR][LF] 分隔。不幸的是,OleDB / MicrosoftJet(或解析这些文件的任何工具)将两者([CR],[CRLF])视为相同。

MY_FILE.TAB 示例(数字和文本之间应该有一个 Tab):

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

在 DataTable 中给我 5 个(格式错误的)行而不是 4 个。

我需要的是:

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

但我明白了:

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

“ree”无法转换为 Int32,因此第四行的第一列为空。

如何配置 OleDB 以将 [CR] 与 [CR][LF] 区别对待?还是有其他想法?

【问题讨论】:

  • 你能具体说明你有什么限制吗?意思是,文件/架构是第三方的,或者您可以根据需要对其进行更新?
  • 我“按原样”获得了这些文件,需要加载它。我无法影响它。

标签: c# oledb carriage-return csv


【解决方案1】:

我不相信您可以直接重新配置 OLEDB 来执行此操作。

另一种方法是使用 TextReader 和 TextWriter 将文件处理为临时文件,单独扫描 CR 并将其替换为一些特殊的转义序列。然后用OLEDB读取这个替换临时文件;最后,将特殊的转义序列替换回 CR。

【讨论】:

  • 是的,这可能是一个快速的'n'dirty hack。 1) 将 [CR][LF] 替换为 X 2) 将 [CR] 替换为 Y 3) 将 X 替换为 [CR][LF] 4) 使用 OleDB 读取 5) 将 Y 替换为 '\n' X 和 Y 应该是独一无二的...
  • @wkada - 我从没想过它会很漂亮,但你的文件格式也不是!
  • +1 一个很好的解决方法 Jeremy;只是因为要使用临时文件,所以我不明白“最后,替换特殊的转义序列” - 我想说在使用后删除临时文件。
  • @Jeremy:不要误会我的意思。我其实很喜欢你的解决方案。而且我也不喜欢这种文件格式。但我想这就是遗产的意义......
  • @KMan:他的意思不是临时文件,而是特殊的 excape 序列(前 CR)需要转换回换行符。
【解决方案2】:

在字符串中读取文件内容不是很容易吗,将其拆分为Environment.NewLine\r\n,这将为您提供每行的数组,您可以进一步拆分tab

【讨论】:

  • 也许可以,但这可能会导致很多其他问题,例如转义序列中的制表符。
猜你喜欢
  • 2019-08-06
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多