2014-03-19 66 views
0

我正在将.csv文件的内容导入到数据表中。这个.csv没有列名,这导致第一行数据成为列。我怎样才能防止这一点?将.csv文件导入到DataTable中遇到问题

我使用string sql_select = "select * from [" + filetable + "]"作为我的命令,我想我可以使用:

DECLARE @tableName [sysname] 
SET @tableName = '[" + filetable + "]' 

DECLARE @sql [nvarchar](MAX) 
SELECT TOP 11 @sql = ISNULL(@sql + ', ', '') + [name] FROM [sys].[all_columns] WHERE OBJECT_ID(@tableName) = [object_id] 
ORDER BY [column_id] 
SET @sql = 'SELECT ' + @sql + ' FROM ' + @tableName 

EXEC (@sql) 

要将列的数量限制为11,此前其前加入的列名。

但我无法得到这个工作,因为预期的OleDbCommand是SELECT。

无论哪种方式,是否可以使用dbDataAdapter.Fill(DataTable);来填充行而不是列?

回答

1

在SO上有很多类似的问题/答案,可以帮助你这个..这个method看起来很有用,看看。

首先确保你所引用:

using System.Data; 
using System.Data.OleDb; 
using System.Globalization; 
using System.IO; 

这里是方法,记得isFirstRowHeader设置为false时,你怎么称呼它:

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader) 
{ 
    string header = isFirstRowHeader ? "Yes" : "No"; 

    string pathOnly = Path.GetDirectoryName(path); 
    string fileName = Path.GetFileName(path); 

    string sql = @"SELECT * FROM [" + fileName + "]"; 

    using(OleDbConnection connection = new OleDbConnection(
       @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
       ";Extended Properties=\"Text;HDR=" + header + "\"")) 
    using(OleDbCommand command = new OleDbCommand(sql, connection)) 
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command)) 
    { 
     DataTable dataTable = new DataTable(); 
     dataTable.Locale = CultureInfo.CurrentCulture; 
     adapter.Fill(dataTable); 
     return dataTable; 
    } 
} 

如果这没有帮助你让我知道我会找到另一种方式。祝你好运!

+0

这工作完全存储在一个CSV文件,谢谢。我一直在搜索文档几个小时,我很高兴解决方案如此快速实施。再次感谢! –

+0

没问题,快乐编码! –

0

我写了下面五个方法。

他们已经设计考虑到可选引号(例如,“符号),并成为多才多艺尽可能不使用其他库:

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) 

使用或使用远程

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

    DataTable dt = GetDataTabletFromRemoteCsv(Url, IsHeadings)