C# 使用csvhelper库编写csv文件

C# 使用csvhelper库编写csv文件,c#,csvhelper,C#,Csvhelper,我正在使用以下代码并得到一个异常 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)) {

我正在使用以下代码并得到一个异常

 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();
IEnumerable csvData=stocks.candles
.选择(c=>new DateLowHigh
{
时间=c.datetime,
Close=c.Close,
低=c.低,
高=c高
})
.ToList();
我确实得到了csvData


答案帮助我开始学习。

我不知道为什么您需要使用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; }
    }
}
sing系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.csv”;
静态void Main(字符串[]参数)
{
股票=新股();
IEnumerable csvData=stocks.candles.Select(c=>newdatelowhigh
{
时间=c.datetime,
Close=c.Close,
低=c.低,
高=c高
}).ToList();
MemoryStream MemoryStream=新的MemoryStream();
使用(var writer=newstreamwriter(memoryStream))
{
字符串[]头={“时间”、“关闭”、“低”、“高”};
WriteLine(string.Join(“,”,headers));
foreach(csvData中的var项)
{
WriteLine(string.Join(“,”,新字符串[]{item.Time.ToString(),item.Close,item.Low.ToString(),item.High.ToString()});
}  
}
memoryStream.Position=0;
}
}
公开股
{
公共列表{get;set;}
}
公共级蜡烛
{
公共日期时间日期时间{get;set;}
公共字符串close{get;set;}
公共整数低{get;set;}
公共整数高{get;set;}
}
公营班级
{
公共日期时间{get;set;}
公共字符串Close{get;set;}
公共整数低{get;set;}
公共整数高{get;set;}
}
}

回答您关于
js
js.SaveAs(“people.csv”,arr)中对象类型的问题很可能是Microsoft.JSInterop.IJSRuntime
,如图所示。您提到的StackOverflow问题可能是使用它来访问他们可以在C#代码中使用的JavaScript。如果您只想使用CsvHelper保存CSV文件,可以简单如下:

使用(var writer=newstreamwriter(“path\\to\\file.csv”))
使用(var csv=new CsvWriter(writer,CultureInfo.InvariantCulture))
{    
csv.WriterRecords(csvData);
}

如果仍然出现错误,则需要使用StackTrace发布完整异常,以便进一步提供帮助

你能用stacktrace发布异常吗?你可以使用CSV库,这样你就不必在每次需要向文件写入不同内容时都重写相同的锅炉板代码。还因为它可以处理数据中有逗号之类的事情。代码只有一行。我可以看到使用一个库时,它是许多行的通用代码。但是一行???@jdweng,你的代码是四行。两个用于标题,两个用于其余行。当前,如果属性
Close
中有逗号或换行符,代码将不会输出正确的CSV。如果
DateLowHigh
有200个属性要写,也可以想象一下您的代码。如果
DateLowHigh
更改或添加属性,则必须返回代码进行更改。使用
CsvHelper
它可以是简单的
csv.WriteRecords(csvData)但如何轻松格式化输出?“我的代码”您可以轻松格式化日期,而不必使用无用的库来显示虚拟错误消息。@jdweng我同意CSV库对于一个看似简单的问题来说似乎有点过火。但是,我花了无数个小时的时间试图找到并更正CSV文件,因为创建CSV文件的人没有用逗号或双引号括起字段或在字段中转义双引号。CsvHelper有多种方法可以轻松格式化数据,而且错误信息比原始海报中包含的内容更多。