从.csv文件创建一个差异文件
本文关键字:一个 文件 csv 文件创建 | 更新日期: 2023-09-27 18:16:14
我正在创建一个将MS Access表和Excel工作表转换为.csv文件的应用程序,然后将访问表与Excel工作表区别开来。csv文件很好,但是产生的差异文件在包含html的字段中有错误(访问表具有html字段)。我不确定这是否是一个特殊字符问题,因为特殊字符在创建。csv文件时不是一个问题,或者如果这是我区分两个文件的方式的问题。
我认为部分问题可能是在访问。csv文件中,包含html的字段被格式化,以便一些信息在单独的行上而不是在一行上,这可能会使读者失去兴趣,但我不知道如何纠正这个问题。
这是创建差异文件的代码:
string destination = Form2.destination;
string path = Path.Combine(destination, "en-US-diff.csv");
string difFile = path;
if (File.Exists(difFile))
{
File.Delete(difFile);
}
using (var wtr = new StreamWriter(difFile))
{
// Create the IEnumerable data sources
string[] access = System.IO.File.ReadAllLines(csvOutputFile);
string[] excel = System.IO.File.ReadAllLines(csvOutputFile2);
// Create the query
IEnumerable<string> differenceQuery = access.Except(excel);
// Execute the query
foreach (string s in differenceQuery)
{
wtr.WriteLine(s);
}
}
物理行vs逻辑行。一种解决方案是使用哨兵,它只是一个任意的字符串标记,以这样的方式选择,以免混淆解析过程,例如"##||##"。
创建输入文件后,将哨兵添加到每行的末尾…
1, 1, 1, 1, 1, 1 ,###||##
回到你的代码,System.IO.File.ReadAllLines(csvOutputFile);使用环境。换行字符串作为它的哨兵。这意味着您需要用以下(伪代码)替换此语句…
const string sentinel = "##||##";
string myString = File.ReadAllText("myFileName.csv");
string[] access = myString.Split(new string[]{sentinel},
StringSplitOptions.RemoveEmptyEntries);
此时,您将在'access'数组中以您想要的方式拥有CSV行作为'逻辑'行集合。
为了使事情更加一致,您还需要在数组的每行上执行此语句…
line = line.Replace(Environment.NewLine, String.Empty).Trim();
这将删除罪魁祸首,并允许您使用已经开发的方法解析CSV。当然,如果需要,该语句可以与LINQ表达式中的IO语句组合使用。