【问题标题】:CsvHelper doesn't write to file as expectedCsvHelper 未按预期写入文件
【发布时间】:2020-07-19 13:11:27
【问题描述】:

下面是我正在使用的代码,我希望在循环的每次迭代期间每一行都会写入文件。我发现如果我使用 ctrl-c 提前结束程序或只是关闭窗口,则文件为空。

我需要经常写入文件,我有 33k 项要添加到文件中,在将 33k 项添加到 CsvWriter 之前几乎不可避免地会出现问题。如果我将循环短路到 20 个项目并让它完成,则输出文件是正确的。我该如何解决这个问题?

int i = 0;
IList<string> pcodes = FindAutobidPcodes();
using (StreamWriter sw = new StreamWriter($"HPH_Catalog_{DateTime.Now.Ticks}.csv"))
using (CsvWriter cw = new CsvWriter(sw, CultureInfo.InvariantCulture))
{
    cw.Configuration.RegisterClassMap<ProductMap>();
    foreach (string code in pcodes)
    {
        string search = $"&search=%7b\"catalog\"%3a\"{catalog}\"%2c\"text\"%3a%7b\"{code}\"%3a\"{code}\"%7d%7d";
        searchQuery.Query = $"{RandomString()}{limit}{page}{search}{gtemplate}&token={token}";
        WebPage webPage = QueryProductData(searchQuery.ToString());
        cw.WriteRecord(Product.ParseJSON(webPage));
        cw.NextRecord();
        i++;
        if(i == 20) { return; }
    }
}

【问题讨论】:

  • 我不确定,但您可以创建一个单独的文件并继续复制
  • 我不能使用 CsvWriter,只使用 StreamWriter 写入,并确保在每次写入后使用 Flush(),以便将结果放入文件中。

标签: c# csvhelper


【解决方案1】:

您可以做的是在每次迭代后刷新 StreamWriter,例如:

    static void Main(string[] args)
    {
        using (StreamWriter sw = new StreamWriter($"HPH_Catalog_{DateTime.Now.Ticks}.csv"))
        using (CsvWriter cw = new CsvWriter(sw, CultureInfo.InvariantCulture))
        {
            for (int i = 0; i < 34000; i++)
            {
                cw.WriteField(i);
                cw.NextRecord();

                sw.Flush();
                System.Threading.Thread.Sleep(100);
            }
        }
    }

您还可以将内部的 foor-each 循环封装到 try 语句中 - 如果循环时出现问题,则在 catch 语句中刷新并处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2019-10-04
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多