gpt4 book ai didi

C# - 使用两个 .txt 文件比较/替换文本

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:20 27 4
gpt4 key购买 nike

我想接受一个文本文件的某种格式。第一个文件加载并重新格式化后,我想打开第二个文本文件并检查第二个文件是否有与第一个重新格式化的文件匹配的文本。现在我成功地将第一个文本文件重新格式化为我想要的格式。第一个(重新格式化的)文本文件如下所示:

    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") 但在每次我打开不同的文件时,这些文件的数字可能。我不确定如何通过每个列表中的每个项目正确迭代以比较字符串(每个“ session ”可能不同)。我还打算将它们连接在一起并将最终结果添加到另一个列表中并将其写入最终的富文本框。但是,我迷路了,对 C# 还很陌生。任何帮助将不胜感激。

问题:如何比较这两个文本文件,将它们正确地放入列表中,比较两个列表中相似的值,将第一个文件中的值替换为第二个文件中匹配值中的以下文本?如果这令人困惑,请告诉我!

提前致谢! :)

最佳答案

如果您的列是用空格或其他一些字符分隔的,请使用 string.Split 来制作一个列数组。选择你想要的列并将其存储在一个 SortedList 中(列既是键又是值),每次添加时检查以确保没有添加重复项。一次读取第二个文件一行,foreach 在 SortedList 键上,如果 string.Contains 键,则将该行标记为具有列值之一。

关于C# - 使用两个 .txt 文件比较/替换文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com