2011-06-24 104 views
2

我想採用某種格式的一個文本文件。第一個文件加載並重新格式化後,我想打開第二個文本文件並檢查第二個文件是否與第一個重新格式化文件有任何文本匹配。現在我成功地將第一個文本文件重新格式化爲我想要的格式。第(格式化)文本文件是這樣的:C# - 使用兩個.txt文件比較/替換文本

1  0010 12345    DEF, DEF-0320     
    1  0020 ABC-00010G   ABC-A,1xx,10%,x1x,0603   
    1  0020A ABC-00010G   ABC-A,1xx,10%,x1x,0603   
    1  0030A ABC-00127G   ABC,4.7xx,10%,x1x,0805 
    . 
    . 
    . 

我想知道如何在這個文件中(上圖),找到第二列(0010,0020 0020A,0030A,...)和比較它/在第二個文本文件中搜索它。第二個文本文件的格式將是這個樣子:

10 BARE PCB 
    20 T C40, C3112 
    B D5, D45, D48 
    30 B R25 
    . 
    . 
    . 

一旦我能夠從第一個文件(0010,0020 0020A,0030A)與第二檔(10,20找到了比賽, B,30)我想抓住10,20,B,30之後的行,並用它們替換第一個文件0010,0020,0020A,0030A。另外,如果第一個數字不以「A」(即0010)結尾,我想在新文件的末尾加上「T」。但是,如果它以「A」(即0030A)結尾,我想在文件末尾加上「B」。另外,對於格式爲「C40」(或類似格式)的第二個文件中的每個值,如果存在多個(由「,」分隔)並且複製上面行中的相同信息。這意味着它應該是這樣的:

1  AAAA BCD 12345    DEF, DEF-0320     T 
    1  C40  ABC-00010G   ABC-A,1xx,10%,x1x,0603  T 
    1  C3112  ABC-00010G   ABC-A,1xx,10%,x1x,0603  T 
    1  D5  ABC-00010G   ABC-A,1xx,20%,x1x,0603  B 
    1  D45  ABC-00010G   ABC-A,1xx,20%,x1x,0603  B 
    1  D48  ABC-00010G   ABC-A,1xx,20%,x1x,0603  B 
    1  R25  ABC-00127G   ABC,4.7xx,100%,x1x,0805  B 

我的代碼一般基礎:

  • 打開按鈕:打開一個txt文件。
  • 保存按鈕:保存新的格式化文本文件,我想將其保存到。
  • 清除按鈕:清除我使用的所有富文本框中的文本。
  • OpenRefs按鈕:打開使用的第一個文件比較的第二個txt文件**

**我也試圖讓這個按鈕,輸出文本的最終格式進入決賽富文本。框。

這是我目前的代碼。

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.IO; 
    using System.Diagnostics; 
    using System.Text.RegularExpressions; 

    namespace Formatter 
    { 
     public partial class Form : Form 
     { 
      // Create a OpenFileDialog to request a path and file name to open. 
      OpenFileDialog openFile = new OpenFileDialog(); 
      OpenFileDialog openRefs = new OpenFileDialog(); 

      public Form() 
      { 
      InitializeComponent(); 
      } 

      private void openButton_Click(object sender, EventArgs e) 
      { 
      // Initialize the OpenFileDialog to specify the .txt extension as well as 
      // its intial directory for the file. 
      openFile.DefaultExt = "*.txt"; 
      openFile.Filter = ".txt Files|*.txt"; 
      openFile.InitialDirectory = "C:\\"; 
      openFile.RestoreDirectory = true; 

      try 
      { 
       // Open the contents of the file into the originalTextRichTextBox. 
       if (openFile.ShowDialog() == DialogResult.OK && openFile.FileName.Length > 0) 
        originalTextRichTextBox.LoadFile(openFile.FileName, RichTextBoxStreamType.PlainText); 

       // Throws a FileNotFoundException otherwise. 
       else 
        throw new FileNotFoundException(); 

       // Resets the formattedTextRichTextBox so multiple files aren't loaded on top of eachother. 
       formattedTextRichTextBox.ResetText(); 

       foreach (string line in File.ReadAllLines(openFile.FileName)) 
       { 
        // Uses regular expressions to find a line that has, digit(s), space(s), digit(s) + letter(s), 
        // space(s), digit(s), space(s), any character (up to 25 times). 
        Match theMatch = Regex.Match(line, @"^[\.*\d]+\s+[\d\w]+\s+[\d\-\w*]+\s+.{25}"); 

        if (theMatch.Success) 
        { 
         // Stores the matched value in string output. 
         string output = theMatch.Value; 

         // Sets the formattedTextRichTextBox to the string output. 
         formattedTextRichTextBox.AppendText(output); 
         formattedTextRichTextBox.AppendText("\n"); 
        } 
       } 
      } 

      // Catches an exception if the file was not opened. 
      catch (Exception) 
      { 
       MessageBox.Show("There was not a specified file path.", "Path Not Found Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      } 
      } 

      private void saveButton_Click(object sender, EventArgs e) 
      { 
      // Create a SaveFileDialog to request a path and file name to save. 
      SaveFileDialog saveFile = new SaveFileDialog(); 

      // Initialize the SaveFileDialog to specify the .txt extension for the file. 
      saveFile.DefaultExt = "*.txt"; 
      saveFile.Filter = ".txt Files|*.txt"; 
      saveFile.InitialDirectory = "C:\\"; 
      saveFile.RestoreDirectory = true; 

      try 
      { 
       // Save the contents of the formattedTextRichTextBox into the file. 
       if (saveFile.ShowDialog() == DialogResult.OK && saveFile.FileName.Length > 0) 
        formattedTextRichTextBox.SaveFile(saveFile.FileName, RichTextBoxStreamType.PlainText); 

       // Throws a FileNotFoundException otherwise. 
       else 
        throw new FileNotFoundException(); 
      } 

      // Catches an exception if the file was not saved. 
      catch (Exception) 
      { 
       MessageBox.Show("There was not a specified file path.", "Path Not Found Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      } 
      } 

      private void clearButton_Click(object sender, EventArgs e) 
      { 
      try 
      { 
       // Resets the text in all of the boxes. 
       originalTextRichTextBox.ResetText(); 
       formattedTextRichTextBox.ResetText(); 
       refsTextRichTextBox.ResetText(); 
       finalTextRichTextBox.ResetText(); 
      } 

      // Catches an exception if the either text box could not be cleared. 
      catch (Exception) 
      { 
       MessageBox.Show("Could not clear the text.", "Clearing Text Box Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      } 
      } 

      private void openRefsButton_Click(object sender, EventArgs e) 
      { 
      // Initialize the OpenFileDialog to specify the .txt extension as well as 
      // its intial directory for the file. 
      openRefs.DefaultExt = "*.txt"; 
      openRefs.Filter = ".txt Files|*.txt"; 
      openRefs.InitialDirectory = "C:\\"; 
      openRefs.RestoreDirectory = true; 

      try 
      { 
       // Open the contents of the file into the originalTextRichTextBox. 
       if (openRefs.ShowDialog() == DialogResult.OK && openRefs.FileName.Length > 0) 
        refsTextRichTextBox.LoadFile(openRefs.FileName, RichTextBoxStreamType.PlainText); 

       // Throws a FileNotFoundException otherwise. 
       else 
        throw new FileNotFoundException(); 


       // ******************************************** 
       // ******************************************** 
       // ******************************************** 
       // FROM HERE DOWN IS WHERE I NEED THE HELP! :) 
       // ******************************************** 
       // ******************************************** 
       // ******************************************** 
       string[] refLines = System.IO.File.ReadAllLines(openRefs.FileName); 

       foreach (string line in refLines) 
       { 
        finalTextRichTextBox.AppendText(line + "\n"); 
       } 

       try 
       { 
        using (StreamReader readRefs = new StreamReader(openRefs.FileName)) 
        { 
         originalTextRichTextBox.ResetText(); 

         List<string> refFileLines = new List<string>(); 

         while (!readRefs.EndOfStream) 
         { 
         refFileLines.Add(readRefs.ReadLine()); 
         } 

         using (StreamReader readFile = new StreamReader(openFile.FileName)) 
         { 
         List<string> fileLines = new List<string>(); 

         while (!readFile.EndOfStream) 
         { 
          fileLines.Add(readFile.ReadLine()); 
         } 
         } 

         refFileLines.Contains(""); 
        } 
       } 

       catch (Exception) 
       { 
        MessageBox.Show("Could not read file.", "Read File Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
       } 
      } 

      // Catches an exception if the file was not opened. 
      catch (Exception) 
      { 
       MessageBox.Show("There was not a specified file path.", "Path Not Found Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
      } 
      } 
     } 
    } 

我在做什麼方面有點失落。我試圖把每行代碼存儲在一個字符串列表中,並且一旦我將兩個文件(打開按鈕和openrefs按鈕)讀入到兩組列表中,我將使用string.contains(「some_string」),但是數字可能每次打開一個不同的文件的文件。我不確定如何通過每個列表中的每個項目來比較字符串(這可以是不同的'會話')。我也打算將它們聯合起來,並將最終結果添加到另一個List中,並將其寫入最終的富文本框。但是,我迷路了,對C#來說很新。任何幫助將不勝感激。

問題:如何比較這兩個文本文件,將它們正確放入列表中,比較兩個相似值列表,將第一個文件中的值替換爲第二個文件中的匹配值中的以下文本文件?如果這是令人困惑的,請告訴我!

在此先感謝! :)

回答

1

如果您的列使用空格或其他字符分隔,請使用string.Split創建一個列數組。選擇你想要的列並將其存儲在SortedList中(列是鍵和值),每次添加時都要檢查以確保不添加重複項。每次讀取第二個文件一行,對SortedList鍵進行foreach,如果string.Contains鍵,則將該行標記爲具有某個列值。

+0

好吧,我正在使用string.Split ..這是我爲那一步的代碼。 string [] finalText = refsTextRichTextBox.Text.Split('');foreach(finalText中的字符串行){finalTextRichTextBox.AppendText(line +「\ n」);} ----這會在最後一個富文本框中用新行上的每個值打印出來。然而,當我使用我的代碼:Match numberMatch = Regex.Match(finalTextRichTextBox.Text,@「^ [\ d] +」); originalTextRichTextBox.AppendText(numberMatch +「\ n」); ---打印輸出僅在新生產線上顯示數字「10」。它似乎只抓住第一條價值線而不是全部..? – theNoobGuy

+0

你使用Regex.Match來試圖完成什麼?我沒有理由將它用於你想要做的任何事情。我已經向您展示瞭如何進行基本的列匹配。你剩下的具體問題是什麼? –

+0

我使用正則表達式來僅匹配只有數行..當我把它分解,它看起來像: BARE PCB 牛逼 C40 乙 ...... 但我要搶10,20等,然後在第一個文件中找到這些值。一旦我在那裏找到它們,我想獲取「C3」格式(即下面的字母和數字)的值,並使用新的正則表達式在文件1中使用string.contains,它找到「C3 「格式化的行來替換string.contains項目。如果這有道理?我是C#的新手,我不確定我是否確切地理解了如何在「答案」文本中說出你所說的話。 – theNoobGuy

1

我並沒有真正獲得記錄的格式,因爲你說你正在分割一個空格,但是你的記錄不能正確地分割。如果你的文件是一個固定長度的文件,那麼你可以使用.substring來拉出數據。如果我正在閱讀你的問題,我想你會想要讀取第一個文件的每一行,並將該行添加到哈希集中,將第二列作爲關鍵字,然後將該行的其餘部分作爲值。然後循環遍歷第二個文件,並且對於該行中的每個值,找到它所使用的鍵,並將該鍵的值與剛剛讀取的行的值一起打印出來。然後,您可以找到一個地方添加一個條件,如果該鍵具有「A」或最後不打印「T」。我認爲你應該遠離正則表達式,因爲表現通常是缺乏的,我不認爲這是你需要的。

 string strFileName = DisplayFile("Please Select File 1", ".txt", null); 

     StreamReader srInput = File.OpenText(strFileName); 

     Hashtable newHash = new Hashtable(); 

     while(srInput.Peek > -1) 
     { 
      string temp = srInput.ReadLine(); 
      string parts = temp.Split('//put delimiter here'); 

      newHash.Add(parts[1]//your key should be your second column     value,parts    [2]//this is your value); 

     } 

//然後在您的第二個文件中讀取並測試每一行以查看它是否在第一個文件中有匹配。

 string strFileName2 = DisplayFile("Please Select File 2", ".txt", null); 

    StreamReader srInput2 = File.OpenText(strFileName); 

    while(srInput2.Peek > -1) 
    { 
    string temp2 = srInput.Readline(); 
    string[] parts2 = temp2.Split('delim'); 

    if(newHash.ContainsKey(parts[whichever is the column you want to check is])) 
    { 
     //then print to value to new file or list 
     //newList.Add(parts[that were checked] + newHash[parts that were checked]); 
    } 
    } 

這樣的事情會起作用。

+0

不幸的是該文件不是固定的長度。 :(我很熟悉正則表達式,而不是用其他方式編碼,這也是不幸的!我正在努力學習:)。我如何將第一個文件存儲到哈希集中,並將第二列作爲關鍵字,其餘列作爲值?我對此不熟悉...... – theNoobGuy