0

我正在使用 C# 开发一个将 csv 文件转换为可读格式的小型应用程序。

以下是 CSV 文件中的示例

"Symbol","Date","Expiry","Strike Price","Open","High","Low","Close","LTP"   
"5000","6000","4500","45855" ............ 

超过300行这样的。

public List<string[]> parseCSV(string path)
{
  List<string[]> parsedData = new List<string[]>();

  try
  {
    using (StreamReader readFile = new StreamReader(path))
    {
      string line;
      string[] row;

      while ((line = readFile.ReadLine()) != null)
      {
        row = line.Split(',');  // <<< this ',' is not working 
        parsedData.Add(row);
      }
    }
  }
  catch (Exception e)
  {
    MessageBox.Show(e.Message);
  }

  return parsedData;
}

根据数据,我应该在 LTP 获得新线路,但它并没有发生,而且比我得到的结果多为 single line 。如果添加列表,即 parseData,它将显示为单行。

4

2 回答 2

2

正如其他人所说,滚动您自己的 CSV 解析器很困难并且容易出错。我个人的偏好在于FileHelpers库,为了向您展示它是多么好和容易,我在您的数据中包含了一个工作示例:

using System;
using FileHelpers;

namespace ConsoleApplication1
{
    internal class Program
    {
        public static void Main()
        {
            /*
            Sample data from TestData.csv
                "Symbol","Date","Expiry","StrikePrice","Open","High","Low","Close"
                "MSF","20090913","03032012","1.233","1.1","14.54","0.07","14.11"
                "APL","20111225","31122011","30.09","31.1","33.33","29.11","33.13"
            */

            var engine = new FileHelperEngine<StockModel>();
            engine.Options.IgnoreFirstLines = 1; // skip the header line

            StockModel[] stocks = engine.ReadFile(@"TestData.csv");

            Console.Read();

        }
    }

    [DelimitedRecord(",")]
    public class StockModel
    {
        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        public string Symbol;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Date, "ddMMyyyy")]
        public DateTime Date;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Date, "ddMMyyyy")]
        public DateTime Expiry;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Decimal, ".")]
        public decimal StrikePrice;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Decimal, ".")]
        public decimal Open;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Decimal, ".")]
        public decimal High;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Decimal, ".")]
        public decimal Low;

        [FieldQuoted('"', QuoteMode.AlwaysQuoted)]
        [FieldConverter(ConverterKind.Decimal, ".")]
        public decimal Close;
    }
}
于 2012-08-28T11:49:47.117 回答
-2

您的代码按预期工作。只需复制/粘贴它,它就会返回一个包含 2 个元素的列表,每行一个。每个元素都是一个字符串数组,第一个有 9 个元素,第二个有 4 个。

关于“停止重新发明轮子”,我个人不同意。解析 CSV 文件是一个简单的过程,您只需逐行读取并调用.Split(delimiter). 如果这样一个简单的过程需要一个特定的库,那么每个项目都会有 500 多个依赖项。

如果您没有特殊要求,例如多个分隔符、异步解析或您自己的代码尚不支持的任何内容,我不会使用 lib。

请记住,使用 lib 还会在您的项目中引入许多潜在问题(许可证问题、可测试性、代码的可扩展性,这通常不是微不足道的,因为您不拥有代码、可移植性、错误......)。

于 2012-08-28T12:21:11.893 回答