【问题标题】:To download and convert csv file to Datatable下载 csv 文件并将其转换为数据表
【发布时间】:2016-01-22 19:06:22
【问题描述】:

我有一个要求,我需要从给定的 url 下载一个 csv 文件,然后将数据从文件导出到数据库。

有什么方法可以直接下载文件并将其转换为数据表,而不是将其保存到硬盘然后将其读取到数据表中。

希望我的问题有意义。

提前致谢

【问题讨论】:

  • 为什么将其写入硬盘而不是内存流?
  • 是的,您可以向某个站点发送请求并读取其响应,而无需将其写入磁盘。
  • 你需要指定你做了什么和你尝试了什么。简单的“我如何......”问题在这里不起作用:stackoverflow.com/help/how-to-ask
  • 总体目标是什么?速度还是易于编码?数据的大小是多少?批量导入 CSV 非常快。

标签: c# .net filestream


【解决方案1】:

您可以使用 StreamReader 类下载 csv 而无需将其保存在本地:

public string DownloadCSV(string url)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest .GetResponse();

    StreamReader streamReader = new StreamReader(httpWebResponse .GetResponseStream());
    string results = streamReader.ReadToEnd();
    streamReader .Close();

    return results;
}

【讨论】:

    【解决方案2】:
    string FileName = ...
    OleDbConnection conn = new OleDbConnection
           ("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + 
             Path.GetDirectoryName(FileName) + 
             "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\"");
    
    conn.Open();
    
    OleDbDataAdapter adapter = new OleDbDataAdapter
           ("SELECT * FROM " + Path.GetFileName(FileName), conn);
    
    DataSet ds = new DataSet("Temp");
    adapter.Fill(ds);
    
    conn.Close();
    

    【讨论】:

      【解决方案3】:

      下面我写了五种方法。

      它们的设计考虑了可选引号(例如 " 符号),并且在不使用其他库的情况下尽可能多用途:

          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)
      

      【讨论】:

        猜你喜欢
        • 2017-11-26
        • 2011-07-14
        • 1970-01-01
        • 2014-11-23
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        相关资源
        最近更新 更多