C#Winforms-读取csv文件的问题

C#Winforms-读取csv文件的问题,c#,csv,streamreader,C#,Csv,Streamreader,我已经看过了所有我能找到的csv阅读示例,但我不太确定我在这一个方面出了什么问题 我对C#相当陌生,但到目前为止我还是很喜欢它 不管怎样,这里的代码在大多数情况下都非常有效(你可以从我在阅读中尝试了一系列不同选项的注释中看到): 我已经链接到一个1行的csv文件,如果有人能好好看一看,我会非常棒 提前感谢,也请随意指出任何我可以改进的通用代码。。。我相信还有很多地方需要改进 再次感谢:) CSV链接: 更新: 抱歉不够清晰,因为我正在阅读文件,所以出现以下错误: System.FormatExc

我已经看过了所有我能找到的csv阅读示例,但我不太确定我在这一个方面出了什么问题

我对C#相当陌生,但到目前为止我还是很喜欢它

不管怎样,这里的代码在大多数情况下都非常有效(你可以从我在阅读中尝试了一系列不同选项的注释中看到):


我已经链接到一个1行的csv文件,如果有人能好好看一看,我会非常棒

提前感谢,也请随意指出任何我可以改进的通用代码。。。我相信还有很多地方需要改进

再次感谢:)

CSV链接:

更新:

抱歉不够清晰,因为我正在阅读文件,所以出现以下错误:

System.FormatException:'输入字符串的格式不正确。'

该行内容如下:

"MECMD4VL2X426,ME,Memory,DDR-4 (Desktop),Corsair Vengeance LPX 8GB (2x4GB) DDR4 2666MHz C16 Desktop Gaming Memory Black,\"Corsair 8GB (2x4GB) DDR4 2666MHz Vengeance LPX Black"
当我查询数组时,它显示如下值:

value[0] "MECMD4VL2X426"
value[1] "ME"
value[2] "Memory"
value[3] "DDR-4"
value[4] "(Desktop)"
value[5] "Corsair"
value[6] "Vengeance"
value[7] "LPX"
...
它似乎卡在括号中(应该读入值[3]),然后开始在空格而不是逗号上分隔


如果需要的话,我很乐意使用第三方csv阅读器,不过我很想了解它是如何工作的。

阅读您使用的csv
string line=sr.ReadLine()但是,
2.6告诉我们,包含多行的字段应使用DQuote
封装

因此,如果文档中存在多行字段,则逐行读取文件将是一个问题。
我会放弃手工制作的regex和
ReadLine
,使用更健壮的解析器,比如

然后定义要从CSV获取的对象

public class Leader
{
    public string LongColumn6 { get; set; }

    public string Supplier { get; set; }
    public string Category { get; set; }
    public string StockCode { get; set; }
    public Decimal Cost { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }
    public string Manufacturer { get; set; }
    public Decimal Sell { get; set; }
    public string StockAdelaide { get; set; }
    public string StockBrisbane { get; set; }
    public string StockMelbourne { get; set; }
    public string StockPerth { get; set; }
    public string StockSydney { get; set; }
    public string Subcategory { get; set; }
}
它是各自的映射器:column&is-Foo-properties等

public sealed class LeaderMap : ClassMap<Leader>
{
    public LeaderMap()
    {
        Map(m => m.LongColumn6).Index(5); // the column that cause the issue

        //complete the List
        Map(m => m.Category).Index(2);
        Map(m => m.StockCode).Index(11);
        Map(m => m.Cost).Index(7);
        Map(m => m.Description).Index(4);
    }
}
公共密封类领导映射:类映射
{
公共领导人
{
Map(m=>m.LongColumn6).Index(5);//导致问题的列
//完成清单
Map(m=>m.Category)指数(2);
Map(m=>m.StockCode).Index(11);
Map(m=>m.Cost)指数(7);
Map(m=>m.Description)。索引(4);
}
}
那么阅读很简单:

using (var csvReader = new CsvReader(reader,  CultureInfo.InvariantCulture ))
{   
    csvReader.Configuration.HasHeaderRecord = false;
    csvReader.Configuration.RegisterClassMap<LeaderMap>();
    records = csvReader.GetRecords<Leader>().ToList();
}
使用(var csvReader=new csvReader(reader,CultureInfo.InvariantCulture))
{   
csvReader.Configuration.HasHeaderRecord=false;
csvReader.Configuration.RegisterClassMap();
records=csvReader.GetRecords().ToList();
}
请注意,在本例中。 我使用StringReader来模拟文件读取器。

您可以使用文件读取器并将其传递给您的路径。

它“读取不正确”“-怎么做?您是否得到错误的列、跳过行、获得异常?请指定。另外,不要尝试使用引号和转义引号来生成sql命令,而是使用参数。最简单的解决方案是Imo使用第三方。你只需要定义类,3行代码就足够了。如果只有1行,请简单地发布。我们不喜欢从未知来源下载东西。Mong Zhu-没错,我不想被空间分割。我将试一试Drag and Drop的解决方案——感谢大家的帮助,非常感谢他们给出了全面的答案——我将试一试,并向大家汇报:)
using (var csvReader = new CsvReader(reader,  CultureInfo.InvariantCulture ))
{   
    csvReader.Configuration.HasHeaderRecord = false;
    csvReader.Configuration.RegisterClassMap<LeaderMap>();
    records = csvReader.GetRecords<Leader>().ToList();
}