【问题标题】:Write csv file using csvhelper library使用 csvhelper 库编写 csv 文件
【发布时间】:2020-02-16 12:57:25
【问题描述】:

我正在使用以下代码并遇到异常,

 Exception thrown: 'CsvHelper.WriterException' in CsvHelper.dll on this line executed:

csv.WriteRecord(item);

这是更多的代码:

using (var memoryStream = new MemoryStream())
{
    using (var writer = new StreamWriter(memoryStream))
    {
        using (var csv = new CsvHelper.CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture))
        {
            foreach (var item in csvData)
            {
                csv.WriteRecord(item); // Exception thrown here
            }
        }
    }

    var arr = memoryStream.ToArray();
    //js.SaveAs("people.csv", arr);  what type object is js? copied from the stackoverflow answer linked here
}

这是 csvData 代码:

IEnumerable<DateLowHigh> csvData = stocks.candles
    .Select(c => new DateLowHigh
    {
        Time = c.datetime,
        Close = c.close,
        Low = c.low,
        High = c.high
    })
    .ToList();

我确实得到了 csvData。

This stackoverflow 回答帮助我入门。

【问题讨论】:

  • 你能用stacktrace发布异常吗?

标签: c# csvhelper


【解决方案1】:

我不知道您为什么需要使用 CsvHelper,因为您可以轻松地使用 IO 库。

sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.csv";
        static void Main(string[] args)
        {
            Stocks stocks = new Stocks();

            IEnumerable<DateLowHigh> csvData = stocks.candles.Select(c => new DateLowHigh
            {
                Time = c.datetime,
                Close = c.close,
                Low = c.low,
                High = c.high
            }).ToList();

            MemoryStream memoryStream = new MemoryStream();
            using (var writer = new StreamWriter(memoryStream))
            {
                string[] headers = {"Time", "Close", "Low", "High"};
                writer.WriteLine(string.Join(",", headers));
                foreach (var item in csvData)
                {
                    writer.WriteLine(string.Join(",", new string[] { item.Time.ToString(), item.Close, item.Low.ToString(), item.High.ToString() }));
                }  
            }
            memoryStream.Position = 0;
        }
    }
    public class Stocks
    {
        public List<Candle> candles { get; set; }
    }
    public class Candle
    {
        public DateTime datetime { get; set; }
        public string close { get; set; }        
        public int low { get; set; }
        public int high { get; set; }
    }
    public class DateLowHigh
    {
        public DateTime Time { get; set; }
        public string Close { get; set; }
        public int Low { get; set; }
        public int High { get; set; }
    }
}

【讨论】:

  • 您将使用 CSV 库,这样您就不必在每次需要为文件编写不同的内容时重写相同的样板代码。也因为它可以处理数据中包含逗号之类的事情。
  • 代码是一行。当它有很多行通用代码时,我可以看到使用库。但是一条线????
  • @jdweng,你的代码是四行。两个用于标题,两个用于其余行。目前,如果属性 Close 中包含逗号或换行符,您的代码将不会输出正确的 CSV。如果DateLowHigh 有 200 个属性要写出,也可以想象一下你的代码。如果DateLowHigh 更改或添加属性,您将不得不返回代码进行更改。使用CsvHelper,它可能只是csv.WriteRecords(csvData);
  • 但是如何轻松格式化输出呢?我的代码可以轻松地格式化日期,而不必使用提供幻像错误消息的无用库。
  • @jdweng 我同意 CSV 库对于一个看起来相当简单的问题似乎有点矫枉过正。但是,我花费了无数个小时来尝试查找和更正 CSV 文件,其中创建它们的人没有将带有逗号或行尾的字段括在双引号中或在字段中转义双引号。 CsvHelper 具有轻松格式化数据的方法,并且错误消息比包含的原始海报更多。
【解决方案2】:

要回答您关于jsjs.SaveAs("people.csv", arr); 中的对象类型的问题,很可能是Microsoft.JSInterop.IJSRuntime,如Blazer HowTo 所示。您引用的 StackOverflow 问题可能是使用它来访问他们可以在 C# 代码中使用的 JavaScript。如果你只是想使用 CsvHelper 保存一个 CSV 文件,它可以很简单:

using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{    
    csv.WriteRecords(csvData);
}

如果您仍然遇到错误,则需要使用 StackTrace 发布完整的异常以提供进一步帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多