我有一个问题应该让大多数人去“WTF?”,但我仍然有它。
我从供应商那里得到了一堆数据文件。它采用自称是 CSV 的自定义平面文件格式,但它不是逗号分隔的,并且值没有被引用。所以,根本不是真正的 CSV。
foo,bar,baz
alice,bob,chris
等等,除了更长更不有趣。问题是,一些记录嵌入了换行符(!!!):
foo,bar
rab,baz
alice,bob,chris
这应该是两个记录,每个记录三个字段。通常,我只会说“不,这很愚蠢。”,但我不经意地仔细观察,发现它实际上是一种与实际行结束顺序不同的行尾:
foo,bar\n
rab,baz\r\n
alice,bob,chris\r\n
注意第一行的 \n。我已经确定这适用于我发现的所有嵌入换行符的情况。所以,我基本上需要做s/\n$//
(我试过这个特定的命令,它没有做任何事情)。
注意:我实际上并不关心字段的内容,所以用空替换换行符就可以了。我只需要文件中的每一行都有相同数量的记录(理想情况下,在同一个地方)。
我编写的用于处理文件的工具中有一个现有的解决方案:
Guid g = Guid.NewGuid();
string data = File.ReadAllText(file, Encoding.GetEncoding("Latin1"));
data = data.Replace("\r\n", g.ToString()); //just so I have a unique placeholder
data = data.Replace("\n", "");
data = data.Replace(g.ToString(), "\r\n");
但是,这在大于 1 GB 左右的文件上会失败。(此外,我还没有对其进行分析,但我怀疑它也很慢)。
我可以使用的工具是:
- cygwin 工具(sed、grep 等)
- 。网
做这个的最好方式是什么?