web-dev-qa-db-ja.com

.NETでCSVファイルを読み取りますか?

C#を使用してCSVファイルを読み取るにはどうすればよいですか?

43
Janmejay

サードパーティのコンポーネントを使用せずに選択できるのは、クラスMicrosoft.VisualBasic.FileIO.TextFieldParserhttp://msdn.Microsoft.com/en-us/library/Microsoft.visualbasic.fileio.textfieldparser.aspx )。 CSVを解析するためのすべての機能を提供します。 Microsoft.VisualBasic Assemblyをインポートするだけで十分です。

var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(file);
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
parser.SetDelimiters(new string[] { ";" });

while (!parser.EndOfData)
{
    string[] row = parser.ReadFields();
    /* do something */
}
57
wahrheit

C#でMicrosoft.VisualBasic.FileIO.TextFieldParserクラスを使用できます。

using System;
using System.Data;
using Microsoft.VisualBasic.FileIO;

static void Main()
{
    string csv_file_path = @"C:\Users\Administrator\Desktop\test.csv";

    DataTable csvData = GetDataTableFromCSVFile(csv_file_path);

    Console.WriteLine("Rows count:" + csvData.Rows.Count);    
    Console.ReadLine();
}

private static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    DataTable csvData = new DataTable();

    try
    {
        using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { "," });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();

            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                }

                csvData.Rows.Add(fieldData);
             }
         }
     }
     catch (Exception ex)
     {
     }

     return csvData;
}
21
kombsh

CsvHelper を試すことができます。これは私が取り組んでいるプロジェクトです。その目標は、CSVファイルの読み取りと書き込みを可能な限り簡単にすると同時に、非常に高速にすることです。

CSVファイルから読み取ることができるいくつかの方法を次に示します。

// By type
var records = csv.GetRecords<MyClass>();
var records = csv.GetRecords( typeof( MyClass ) );

// Dynamic
var records = csv.GetRecords<dynamic>();

// Using anonymous type for the class definition
var anonymousTypeDefinition =
{
    Id = default( int ),
    Name = string.Empty,
    MyClass = new MyClass()
};
var records = csv.GetRecords( anonymousTypeDefinition );
7
Josh Close

アプリケーションでこのライブラリを使用しました。 http://www.codeproject.com/KB/database/CsvReader.aspx 。このライブラリを使用してすべてがスムーズに行われたため、お勧めします。 MITライセンスの下で無料なので、ソースファイルに通知を含めるだけです。

ブラウザでCSVを表示しませんでしたが、作成者はRepeatersまたはDataGridsのサンプルをいくつか持っています。私が追加したソート操作をテストするために彼のテストプロジェクトの1つを実行しましたが、かなり見栄えが良かったです。

4
John Hoven

私はお勧め Angara.Table、保存/読み込みについて: http://predictionmachines.github.io/Angara.Table/saveload.html

列タイプを推測し、CSVファイルを保存でき、TextFieldParserよりもはるかに高速です。 CSV形式のRFC4180に準拠し、複数行の文字列、NaN、および区切り文字を含むエスケープ文字列をサポートします。

ライブラリはMIT license。ソースコードは https://github.com/Microsoft/Angara.Table の下にあります。

APIはF#に重点を置いていますが、どの.NET言語でも使用できますが、F#ほど簡潔ではありません。

例:

using Angara.Data;
using System.Collections.Immutable;

...

var table = Table.Load("data.csv");

// Print schema:
foreach(Column c in table)
{
    string colType;
    if (c.Rows.IsRealColumn) colType = "double";
    else if (c.Rows.IsStringColumn) colType = "string";
    else if (c.Rows.IsDateColumn) colType = "date";
    else if (c.Rows.IsIntColumn) colType = "int";
    else colType = "bool";

    Console.WriteLine("{0} of type {1}", c.Name, colType);
}

// Get column data:
ImmutableArray<double> a = table["a"].Rows.AsReal;
ImmutableArray<string> b = table["b"].Rows.AsString;

Table.Save(table, "data2.csv");

Cinchoo ETL -CSVファイルの読み取りおよび書き込み用のオープンソースライブラリを試すことができます。

CSVファイルを読み取ることができるいくつかの方法

Id, Name
1, Tom
2, Mark

これは、このライブラリを使用して読み取る方法です

using (var reader = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
   foreach (dynamic item in reader)
   {
      Console.WriteLine(item.Id);
      Console.WriteLine(item.Name);
   }
}

以下のようなCSVファイルと一致するように定義されたPOCOオブジェクトがある場合

public class Employee
{
   public int Id { get; set; }
   public string Name { get; set; }
}

以下のように、このPOCOクラスを使用して同じファイルを解析できます

using (var reader = new ChoCSVReader<Employee>("emp.csv").WithFirstLineHeader())
{
   foreach (var item in reader)
   {
      Console.WriteLine(item.Id);
      Console.WriteLine(item.Name);
   }
}

使い方については CodeProject の記事をご覧ください。

免責事項:私はこのライブラリの著者です

1
RajN

私は通常、次のような単純なアプローチを使用します。

var path = Server.MapPath("~/App_Data/Data.csv");
var csvRows = System.IO.File.ReadAllLines(path, Encoding.Default).ToList();

foreach (var row in csvRows.Skip(1))
{
    var columns = row.Split(';');

    var field1 = columns[0];
    var field2 = columns[1];
    var field3 = columns[2];
}
1
MichaelCleverly

CodeProject のLinq2Csvライブラリに興味があるかもしれません。確認する必要があることの1つは、必要なときにのみデータを読み取るので、大きなファイルを操作するときに多くのメモリを必要としないことです。

ブラウザにデータを表示するために、あなたはそれを達成するために多くのことをすることができます、あなたがあなたの要件がより具体的であるならば、答えはより具体的であるかもしれませんが、あなたができること:
1。 HttpListenerクラスを使用して、単純なWebサーバーを作成します(ネット上のHost mini-httpサーバーに多くのサンプルがあります)。
2。 Asp.NetまたはAsp.Net Mvcを使用してページを作成し、IISを使用してホストします。

1
Marcin Deptuła

CodeProjectまたはCodePlexにはCSV解析用のプロジェクトがかなりあるようです。 CodePlexの別のCSVパーサーを次に示します。

http://commonlibrarynet.codeplex.com/

このライブラリには、CSV解析用のコンポーネント、INIファイル解析、コマンドライン解析もあります。これまでのところうまく機能しています。唯一のものはCSVライターがないことです。

1
alex

私は数年前から FlatFiles と呼ばれるオープンソースプロジェクトを維持しています。 .NET Coreおよび.NET 4.5.1で使用できます。

他のほとんどの選択肢とは異なり、極端なレベルの精度でスキーマを定義できます(EFコードファーストの動作に似ています)。そのため、常に変換の問題と戦う必要はありません。データクラスに直接マップできます。また、古いADO.NETクラスとのインターフェイスのサポートもあります。

パフォーマンスの面では、.NET用の最速のパーサーの1つになるように調整されており、風変わりな形式の違いに対するオプションが豊富にあります。必要に応じて、固定長ファイルのサポートもあります。

1
Travis Parks

これは、CSVを解析するためだけです。 Webページに表示するには、リストを取得して、必要に応じてレンダリングするだけです。

注:このコード例は、入力文字列lineに改行が含まれる状況を処理しません。

public List<string> SplitCSV(string line)
{
    if (string.IsNullOrEmpty(line))
        throw new ArgumentException();

    List<string> result = new List<string>();

    int index = 0;
    int start = 0;
    bool inQuote = false;
    StringBuilder val = new StringBuilder();

    // parse line
    foreach (char c in line)
    {
        switch (c)
        {
            case '"':
                inQuote = !inQuote;
                break;

            case ',':
                if (!inQuote)
                {
                    result.Add(line.Substring(start, index - start)
                        .Replace("\"",""));

                    start = index + 1;
                }

                break;
            }

            index++;
        }

        if (start < index)
        {
            result.Add(line.Substring(start, index - start).Replace("\"",""));
        }

        return result;
    }
}
1
Freddy