2015-11-28 40 views
0

我需要建立一個方法來增強一個CSV文件與另一個值。這種方法將需要:查找和替換2 CSV文件之間的記錄C#

  • 採取「原始」的csv文件
  • 從它的0列的每一行,查找一個匹配的記錄中的「增強」 CSV文件的0柱
  • 如果有是匹配的,那麼對於該行,「原始」文件的列1中的記錄將被「增強」文件的列1中的對應記錄覆蓋

我正在嘗試下面的模式,這看起來可行 - 但它太慢了,我甚至無法檢查它。文件的大小不應該是個問題,因爲一個是1MB,另一個是2MB,但我肯定會採取一些錯誤的假設來有效地完成這個任務。什麼是更好的方式來做到這一點?

public static string[] LoadReadyCsv() 
     { 
      string[] scr = System.IO.File.ReadAllLines(@Path...CsvScr); 
      string[] aws = System.IO.File.ReadAllLines(@Path...CsvAws); 
      Regex CSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))"); 

      foreach (var s in scr) 
      { 
       string[] fieldsScr = CSVParser.Split(s); 

       foreach (var a in aws) 
       { 
        string[] fieldsAws = CSVParser.Split(a); 

        if (fieldsScr[0] == fieldsAws[0]) 
        { 
         fieldsScr[1] = fieldsAws[1]; 
        } 
       } 
      } 

      return scr; 
     } 

編輯: 我添加下面的例子,所請求

「原始文件」

ean, skunum, prodname 
111, empty, bread 
222, empty, cheese 

「增強文件」

ean, skunum, prodname 
111, 555, foo 
333, 444, foo 

新的 「原始文件」

ean,skunum,prodname 
111, 555, bread 
222, empty, cheese 
+0

什麼你通過匹配記錄意思?覆蓋的條件是什麼 - 價值存在/更大? –

+0

增強將基本上意味着在任何情況下「覆蓋」該記錄。 – Turo

+0

這個複雜的正則表達式有一個原因嗎?幫助我理解你想用這個達到什麼目的。 – Steve

回答

1

可以使用OLEDB讀取CSV和加載到一個數據表。然後你可以修改表格並更新它將結果保存迴文件。下面

public class CSVReader 
    { 

     public DataSet ReadCSVFile(string fullPath, bool headerRow) 
     { 

      string path = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1); 
      string filename = fullPath.Substring(fullPath.LastIndexOf("\\") + 1); 
      DataSet ds = new DataSet(); 

      try 
      { 
       if (File.Exists(fullPath)) 
       { 
        string ConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" + ";Extended Properties=\"Text;HDR={1};FMT=Delimited\\\"", path, headerRow ? "Yes" : "No"); 
        string SQL = string.Format("SELECT * FROM {0}", filename); 
        OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, ConStr); 
        adapter.Fill(ds, "TextFile"); 
        ds.Tables[0].TableName = "Table1"; 
       } 
       foreach (DataColumn col in ds.Tables["Table1"].Columns) 
       { 
        col.ColumnName = col.ColumnName.Replace(" ", "_"); 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      return ds; 
     } 
    }​ 

使用代碼來修改兩個DataTable中使用LINQ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataColumn col = null; 

      DataTable original = new DataTable(); 
      col = original.Columns.Add("ean", typeof(int)); 
      col.AllowDBNull = true; 
      col = original.Columns.Add("skunum", typeof(int)); 
      col.AllowDBNull = true; 
      col = original.Columns.Add("prodname", typeof(string)); 
      col.AllowDBNull = true; 

      original.Rows.Add(new object[] {111, null, "bread"}); 
      original.Rows.Add(new object[] {222, null, "cheese"}); 

      DataTable enhancement = new DataTable(); 
      col = enhancement.Columns.Add("ean", typeof(int)); 
      col.AllowDBNull = true; 
      col = enhancement.Columns.Add("skunum", typeof(int)); 
      col.AllowDBNull = true; 
      col = enhancement.Columns.Add("prodname", typeof(string)); 
      col.AllowDBNull = true; 

      enhancement.Rows.Add(new object[] {111, 555, "foo"}); 
      enhancement.Rows.Add(new object[] {333, 444, "foo"}); 

      var joinedObject = (from o in original.AsEnumerable() 
           join e in enhancement.AsEnumerable() on o.Field<int>("ean") equals e.Field<int>("ean") 
           select new { original = o, enhancement = e }).ToList(); 

      foreach (var row in joinedObject) 
      { 
       row.original["skunum"] = row.enhancement["skunum"]; 
       row.original["prodname"] = row.enhancement["prodname"]; 
      } 
     } 
    } 
} 
​ 
+0

謝謝我upvote您的答案建議使用OleDB,我需要嘗試,當我得到一些時間。在此期間,原始解決方案適用於我 - 它很慢,但到目前爲止我能負擔得起,我只是從正則表達式切換到VisualBasic TextFieldParser庫 – Turo

+0

我更新了代碼以顯示如何使用Linq Join來修改原始表。您可以使用數據表更新方法保存回原始的csv文件。 – jdweng

+0

我終於嘗試了OLEDB,這個工作非常好,並且多次加速查詢。數據集現在成爲我數據處理的好朋友。謝謝jdweng! – Turo