从.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);
        }        
    }

从.csv文件创建一个差异文件

物理行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语句组合使用。