我想採用某種格式的一個文本文件。第一個文件加載並重新格式化後,我想打開第二個文本文件並檢查第二個文件是否與第一個重新格式化文件有任何文本匹配。現在我成功地將第一個文本文件重新格式化爲我想要的格式。第(格式化)文本文件是這樣的: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#來說很新。任何幫助將不勝感激。
問題:如何比較這兩個文本文件,將它們正確放入列表中,比較兩個相似值列表,將第一個文件中的值替換爲第二個文件中的匹配值中的以下文本文件?如果這是令人困惑的,請告訴我!
在此先感謝! :)
好吧,我正在使用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
你使用Regex.Match來試圖完成什麼?我沒有理由將它用於你想要做的任何事情。我已經向您展示瞭如何進行基本的列匹配。你剩下的具體問題是什麼? –
我使用正則表達式來僅匹配只有數行..當我把它分解,它看起來像: BARE PCB 牛逼 C40 乙 ...... 但我要搶10,20等,然後在第一個文件中找到這些值。一旦我在那裏找到它們,我想獲取「C3」格式(即下面的字母和數字)的值,並使用新的正則表達式在文件1中使用string.contains,它找到「C3 「格式化的行來替換string.contains項目。如果這有道理?我是C#的新手,我不確定我是否確切地理解了如何在「答案」文本中說出你所說的話。 – theNoobGuy