2010-12-07 30 views
1

私のディスクに保存されているCSVファイルからデータを読み込み、CSVのすべてのデータを.Net DataTableに格納する必要があります。CSVから.net DataTableにデータを読み取る

どうすればいいですか?

+0

可能重複([CSV .NETデータテーブルにファイルを読み取る方法] http://stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable) –

答えて

0

Microsoftのフォーラムには、CSVファイルへのデータ接続文字列を使用するa thread about thisがあります。これはおそらく最も簡単で簡単な方法です。

また、一度に1行ずつファイルを読み取り、各行のDataRowを作成してDataTableに追加することもできます。これはもっと手作業であり、ファイル(カラム数、カラム名、データタイプなど)を前提にする必要があるかもしれませんが、それが既知のファイルの場合には大きな問題ではありません。

0

Filehelpersを試してみてください

var table = new DataTable(); 
using(var reader = new CsvReader(path)) { 
    table.Load(reader); 
} 

(それはメモリからです):IIRCそれだけでなければなりません。それはあなたがデータテーブルにあなたのデータを得るのを助けるでしょう、そして強い型付けされたオブジェクト

+0

私はFilehelpersも使用しています。 Filehelpersは過去に私の人生をとてもシンプルにしました。 – pavanred

0

私はCsvファイルをDataTableに変える5つの方法を書いています。

彼らは、アカウントオプションの引用符(例: "記号)に取るようにして他のライブラリを使用せずに、できるだけ汎用性になるように設計されています:

public static DataTable GetDataTabletFromCSVFile(string filePath, bool isHeadings) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      using (TextFieldParser TextFieldParser = new TextFieldParser(filePath)) 
      { 
       if (isHeadings) 
       { 
        MethodResult = GetDataTableFromTextFieldParser(TextFieldParser); 

       } 
       else 
       { 
        MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser); 

       } 

      } 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

    public static DataTable GetDataTableFromCsvString(string csvBody, bool isHeadings) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      MemoryStream MemoryStream = new MemoryStream(); 


      StreamWriter StreamWriter = new StreamWriter(MemoryStream); 

      StreamWriter.Write(csvBody); 

      StreamWriter.Flush(); 


      MemoryStream.Position = 0; 


      using (TextFieldParser TextFieldParser = new TextFieldParser(MemoryStream)) 
      { 
       if (isHeadings) 
       { 
        MethodResult = GetDataTableFromTextFieldParser(TextFieldParser); 

       } 
       else 
       { 
        MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser); 

       } 

      } 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

    public static DataTable GetDataTableFromRemoteCsv(string url, bool isHeadings) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
      HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

      StreamReader StreamReader = new StreamReader(httpWebResponse.GetResponseStream()); 

      using (TextFieldParser TextFieldParser = new TextFieldParser(StreamReader)) 
      { 
       if (isHeadings) 
       { 
        MethodResult = GetDataTableFromTextFieldParser(TextFieldParser); 

       } 
       else 
       { 
        MethodResult = GetDataTableFromTextFieldParserNoHeadings(TextFieldParser); 

       } 

      } 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 


    private static DataTable GetDataTableFromTextFieldParser(TextFieldParser textFieldParser) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      textFieldParser.SetDelimiters(new string[] { "," }); 

      textFieldParser.HasFieldsEnclosedInQuotes = true; 


      string[] ColumnFields = textFieldParser.ReadFields(); 

      DataTable dt = new DataTable(); 

      foreach (string ColumnField in ColumnFields) 
      { 
       DataColumn DataColumn = new DataColumn(ColumnField); 

       DataColumn.AllowDBNull = true; 

       dt.Columns.Add(DataColumn); 

      } 


      while (!textFieldParser.EndOfData) 
      { 
       string[] Fields = textFieldParser.ReadFields(); 


       for (int i = 0; i < Fields.Length; i++) 
       { 
        if (Fields[i] == "") 
        { 
         Fields[i] = null; 

        } 

       } 

       dt.Rows.Add(Fields); 

      } 

      MethodResult = dt; 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

    private static DataTable GetDataTableFromTextFieldParserNoHeadings(TextFieldParser textFieldParser) 
    { 
     DataTable MethodResult = null; 
     try 
     { 
      textFieldParser.SetDelimiters(new string[] { "," }); 

      textFieldParser.HasFieldsEnclosedInQuotes = true; 

      bool FirstPass = true; 

      DataTable dt = new DataTable(); 

      while (!textFieldParser.EndOfData) 
      { 
       string[] Fields = textFieldParser.ReadFields(); 

       if(FirstPass) 
       { 
        for (int i = 0; i < Fields.Length; i++) 
        { 
         DataColumn DataColumn = new DataColumn("Column " + i); 

         DataColumn.AllowDBNull = true; 

         dt.Columns.Add(DataColumn); 

        } 

        FirstPass = false; 

       } 

       for (int i = 0; i < Fields.Length; i++) 
       { 
        if (Fields[i] == "") 
        { 
         Fields[i] = null; 

        } 

       } 

       dt.Rows.Add(Fields); 

      } 

      MethodResult = dt; 

     } 
     catch (Exception ex) 
     { 
      ex.HandleException(); 
     } 
     return MethodResult; 
    } 

私のように、あなたが報告するから保存している、場合サービスは、あなたはこのようにそれを使用する必要があります。そうしないと

Warning[] warnings; 
    string[] streamids; 
    string mimeType; 
    string encoding; 
    string filenameExtension; 

    byte[] bytes = rvMain.ServerReport.Render("csv", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings); 

    string CsvBody = System.Text.Encoding.UTF8.GetString(bytes); 

    DataTable dt = GetDataTableFromCsvString(CsvBody,true); 

、あなたが必要なのは次のとおりです。

bool IsHeadings = true; //Does the data include a heading row? 

    DataTable dt = GetDataTableFromCsvString(CsvBody, IsHeadings); 

またはCSVファイルから直接使用する

bool IsHeadings = true; //Does the data include a heading row? 

    DataTable dt = GetDataTabletFromCsvFile(FilePath, IsHeadings) 

またはリモートに格納されたCSVファイルを使用する

bool IsHeadings = true; //Does the data include a heading row? 

    DataTable dt = GetDataTabletFromRemoteCsv(Url, IsHeadings) 
関連する問題