【问题标题】:Write/Edit CSV-file (not rewrite the whole file!)写入/编辑 CSV 文件(不重写整个文件!)
【发布时间】:2011-03-31 21:38:09
【问题描述】:

我需要替换直接在 CSV 文件上运行的客户端的某些功能,该文件用作系统的配置文件。

搜索中可用的大多数案例都是关于从 CSV 读取到其他格式的。

Other 将整个 CSV 放入内存,附加专用行和更改,然后将它们写回新文件(或覆盖现有文件)。

我想更聪明地完成这项任务,并寻求建议和代码创意。
我们可以假设每次只有一个用户可以访问该文件。
该文件使用 File.ReadLines() .NET 4 读取。

我的示例项目的一部分,

   var lines = from l in File.ReadLines("/Linq2Csv/data.csv")
               where l.Split(',')[0].StartsWith("Jonas") //Just test 'n pick 1 line
               select new
               {
                 Name = l.Split(',')[0],
                 ...

【问题讨论】:

    标签: c# csv


    【解决方案1】:

    CSV 文件只是一个连续的文本文件。

    如果您想修改您拥有的内容以将整个文件读入内存,请在此处修改并再次写出。

    假设文件包含以下内容的更一般情况:

    ABCDEFGHIJKLMNOPQRSTUV

    如果您想从中间删除“IJLKM”,您必须阅读文件的其余部分 (NOP...),这样您就可以将其随机排列以满足 (...FGH)。

    如果要在“M”和“N”之间插入“0123456789”,则需要读取 N-Z,否则新字符将覆盖“NOPQRSTUVW”。

    【讨论】:

    • 当然,在插入和删除中,您都可以在不读取所有文件的情况下一次完成 - 它只是变得有点繁琐;p 它可能涉及一些向后和向前搜索,因此建议使用大小合理的缓冲区(不要一次移动一个字节)
    • 在我的脑海中,我会去寻找字符,拆分“左部分”和“右部分”,然后将“左部分、新部分、右部分”组合在一起。但你可能是对的。整个文件必须进入内存。子句只是,什么方法最有效。
    • @Jonas - 是的,这对人类来说很容易,但当你必须告诉计算机确切地该做什么时,它是冗长的。
    • 长篇大论是好的,到目前为止它可以在没有 CPU / 内存的线性(并且上帝不是阶乘)负载的情况下解决 :-)
    【解决方案2】:

    .NET Framework v4.0 带有一个用于内存映射文件支持的新类,请参阅

    1. msdn
    2. article

    您将有很大的机会完成这项工作。当线长发生变化时,您仍然会遇到要解决的问题。但是,如果您想要随机访问和虚假更新(例如,将“MSFT”替换为“UNIX”),您将获得无与伦比的性能。

    您可以采用填充策略在每个单元格/行中留出“备用空间”,以克服更改字段/行长度的问题。

    总的来说,我认为 CSV 文件的成本不值得,但该技术时不时出现,值得一提。

    干杯, 赛斯

    【讨论】:

    • 你可能是对的。 NET 4 还为我们提供了 ReadLines() 而不是 ReadAllLines()(如上面的示例所示),但它对写入事件没有帮助。目标似乎是找到内存处理文件内容的最佳方法,按目的更改/添加,然后覆盖文件..
    【解决方案3】:

    在 .NET 中完成此操作的唯一方法是将其从 csv 文件移动到真正的数据库中。

    您可以像打开数据库中的表一样打开文本文件。在此处查看 ConnectionString 示例以连接到它:http://www.connectionstrings.com/textfile

    但是,即使使用 .NET 将其视为数据库也不会阻止底层代码在更新时覆盖整个文件。

    文本文件并不适合并发用户。这就是存在真正数据库的原因。

    【讨论】:

    • 此提供商正在读取 CSV 文件,而我自己无法制造沃尔沃!只需创建驱动程序。但是将其移入数据库是一项可能的任务,但是,所有密钥都已存储在数据库中,因此回到标准的 csv 文件创建器/流编写器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2022-12-15
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多