2013-05-31 163 views
1

我正在創建一個應用程序,它將MS Access表格和Excel工作表轉換爲.csv文件,然後區分Excel表格和Excel工作表。 .csv文件很好,但生成的差異文件在包含html的字段中存在錯誤(訪問表具有html字段)。我不確定這是否是特殊字符問題,因爲特殊字符首先不是創建.csv文件的問題,或者如果它是我區分這兩個文件的方式的問題。從.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); 
     }   
    } 
+0

csv更適合表格數據,在這種情況下,可能xml是一個更好的選擇,您可以使用CDATA字段的html代碼.. – Oscar

+0

您需要一個關鍵的行。然後你可以創建一個自定義比較並將它傳遞給'Except()'。我已經做到了,WOW速度很快。 – Hogan

+0

邏輯線與物理線。我也有過這個問題。我在第一次創建文件時在每條邏輯行的末尾放置標記來解決這個問題。在這方面的努力時間很短,我相信還有更好的辦法。奧斯卡指出,XML CDATA可能是首選方法。同時,如果您在創建文件時有控制權,請考慮哨兵。 –

回答

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語句組合使用。

+0

作品幾乎完美。非常感謝 –