1

我正在创建一个应用程序,它将 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);
        }        
    }
4

1 回答 1

1

物理线路与逻辑线路。一种解决方案是使用标记,它只是以不混淆解析过程的方式选择的任意字符串标记,例如“##||##”。

创建输入文件后,将标记添加到每行的末尾...

1,1,1,1,1,1,###||##

回到您的代码 System.IO.File.ReadAllLines(csvOutputFile); 使用 Environment.Newline 字符串作为其标记。这意味着您需要将此语句替换为以下(伪代码)...

    const string sentinel = "##||##";
    string myString = File.ReadAllText("myFileName.csv");
    string[] access = myString.Split(new string[]{sentinel}, 
                               StringSplitOptions.RemoveEmptyEntries);

那时,您将在“访问”数组中以您想要的方式将 CSV 行作为“逻辑”行的集合。

为了使事情进一步符合要求,您还需要在数组的每一行上执行此语句...

line = line.Replace(Environment.NewLine, String.Empty).Trim();

这将消除罪魁祸首,并允许您使用您已经开发的方法解析 CSV。当然,如果需要,该语句可以与 LINQ 表达式中的 IO 语句结合使用。

于 2013-05-31T19:49:13.253 回答