C#Winforms-读取csv文件时出现问题

问题描述 投票:-2回答:1

我看了所有可以找到的csv阅读示例,但我不确定这是哪里出了问题。

我对C#还是很陌生,但到目前为止仍很喜欢。

无论如何,这里的代码在most时都很好用(您可以通过我在阅读中尝试过很多不同选项的注释看到:]

StreamReader sr = new StreamReader(csvFileToImport);
while (sr.EndOfStream != true)
{
    string line = sr.ReadLine();
//string[] value = line.Split(new string[] { "\",\"" }, StringSplitOptions.None);
//string[] value = line.Split(new string[] {","}, StringSplitOptions.None);
//string[] value = line.Split(new string[] { "(?=(?:[^']*'[^']*')*[^']*$)" }, StringSplitOptions.None);
//string[] value = line.Split(new string[] { "," }, StringSplitOptions.None);
string[] value = Regex.Split(line, @"\s|[,]");

StockItem si = new StockItem();
    switch (stockFile.Supplier)
    {
        case "Leader":
            si.Supplier = stockFile.Supplier;
            si.Category = value[2].Replace("'", "''");
            si.StockCode = value[11].Replace("'", "''");
            si.Cost = Convert.ToDecimal(value[7]);
            si.Description = value[4].Replace("'", "''");
            si.Image = value[9].Replace("'", "''");
            si.Manufacturer = value[10].Replace("'", "''");
            si.Sell = Convert.ToDecimal(value[8]);
            si.StockAdelaide = value[17].Replace("'", "''");
            si.StockBrisbane = value[18].Replace("'", "''");

            si.StockMelbourne = value[19].Replace("'", "''");
            si.StockPerth = value[20].Replace("'", "''");
            si.StockSydney = value[21].Replace("'", "''");
            si.Subcategory = value[3].Replace("'", "''");

            //Add line into db
            string sql = "insert into Stock (Supplier, StockCode, Manufacturer, Category, Subcategory, Description, Cost, Sell, Image, StockPerth, StockAdelaide, StockSydney, StockBrisbane, StockMelbourne) values ('" + si.Supplier + "', '" + si.StockCode + "', '" + si.Manufacturer + "', '" + si.Category + "', '" + si.Subcategory + "', '" + si.Description + "', " + si.Cost + ", " + si.Sell + ", '" + si.Image + "', '" + si.StockPerth + "', '" + si.StockAdelaide + "', '" + si.StockSydney + "', '" + si.StockBrisbane + "', '" + si.StockMelbourne + "')";
            cmd = new SqlCommand(sql, cn);
            cmd.ExecuteNonQuery();
            break;
        default:
            break;
    }
}
success = true;
cn.Close();

我已经链接到1行csv文件,如果有人愿意这样好看,我将无法正确阅读,我将非常感激!

感谢您,也可以随时指出我可以改进的任何常规代码……我相信还有很多地方可以改进。

CSV link

c# csv streamreader
1个回答
0
投票

读取csv时使用string line = sr.ReadLine();,但使用RFC 4180 ,2.6告诉我们,包含Digote "的字段必须包含多行。

因此,如果文档中存在多个行字段,则逐行读取文件将是一个问题。我将放弃手工的正则表达式和ReadLine,并使用更强大的解析器,例如CSV Helper

然后定义要从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; }
}

并且是各自的映射器:列&是Foo属性等。

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);
    }
}

然后阅读很简单:

using (var csvReader = new CsvReader(reader,  CultureInfo.InvariantCulture ))
{   
    csvReader.Configuration.HasHeaderRecord = false;
    csvReader.Configuration.RegisterClassMap<LeaderMap>();
    records = csvReader.GetRecords<Leader>().ToList();
}

注意,在此live demo中。我使用StringReader来模拟文件阅读器。您可以使用文件阅读器并将其传递给您的路径。

© www.soinside.com 2019 - 2024. All rights reserved.