查找并替换2个CSV文件C#之间的记录
本文关键字:之间 记录 文件 CSV 替换 2个 查找 | 更新日期: 2023-09-27 18:25:01
我需要构建一个方法,用另一个csv文件的值来增强一个csw文件。此方法需要:
- 获取"原始"csv文件
- 对于第0列中的每一行,在"增强"csv文件的第0列查找匹配记录
- 如果匹配,则对于此行,"原始"文件第1列中的记录将被"增强"文件第2列中的相应记录覆盖
我正在尝试下面的模式,这似乎是可行的,但它太慢了,我甚至无法检查它。文件的大小应该不是问题,因为一个是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
您可以使用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;
}
}
要修改两个数据表,请使用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"];
}
}
}
}