gpt4 book ai didi

c# - 如何从文件中删除\n 字符?

转载 作者:太空狗 更新时间:2023-10-30 00:42:53 28 4
gpt4 key购买 nike

我有一个问题应该会让大多数人都“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 等)
  • .NET

执行此操作的最佳方法是什么?

最佳答案

与其将整个内容作为一个大(可能是巨大的)字符串读入内存,不如考虑一种基于流的方法。

打开输入流并一次读取一行,根据需要进行替换。打开输出流并将修改后的行写入其中。像这样的东西:

static void Main( string[] args )
{
using( var inFs = File.OpenRead( @"C:\input.txt" ) )
using( var reader = new StreamReader( inFs ) )
using( var outFs = File.Create( @"C:\output.txt" ) )
using( var writer = new StreamWriter( outFs ) )
{
int cur;
char last = '0';
while( ( cur = reader.Read() ) != -1 )
{
char next = (char)reader.Peek();
char c = (char)cur;
if( c != '\n' || last == '\r' )
writer.Write( c );

last = c;
}
}
}

关于c# - 如何从文件中删除\n 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13145924/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com