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 で新しい行を取得する必要がありますが、それは行われておらず、単一の行として結果が得られていません。リスト、つまり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

コードは期待どおりに機能します。コピーして貼り付けるだけで、各行に1つずつ、合計2つの要素を含むリストが返されます。各要素は文字列配列であり、最初の要素には9つの要素があり、2番目の要素には4つの要素があります。

「車輪の再発明をやめる」ことに関して、私は個人的に同意しません。CSVファイルの解析は単純なプロセスであり、行ごとに読み取ってを呼び出すだけ.Split(delimiter)です。このような単純なプロセスで特定のライブラリが必要な場合、すべてのプロジェクトに500以上の依存関係があります。

複数の区切り文字、非同期解析、または独自のコードでまだサポートされていないものなどの特別な要件がない場合は、libを使用しません。

libを使用すると、プロジェクトに多くの潜在的な問題が発生することを忘れないでください(ライセンスの問題、テスト容易性、コードの拡張性。コードを所有していないため、コードの拡張性、移植性、バグなど)。

于 2012-08-28T12:21:11.893 に答える