gpt4 book ai didi

c# - 文件检查和打印

转载 作者:行者123 更新时间:2023-11-30 22:35:25 25 4
gpt4 key购买 nike

我正在编写一个程序,它一次打开一个文件,解析它,并将解析后的数据输出到一个新的 .txt 文档中,该文档根据传入的文件命名。有超过 50 个文件正在处理被读取和解析。

因此,如果打开的文件的名称如下:STACK-OVERFLOW-125663-D2.txt输出文件将是像这样的 125663-D2.txt

每次读取文件时,都会对其部件号进行解析。每个文件将包含类似于此的行(第 8 个分隔的逗号值(即 119082、119083、119040、119085、119084)是零件编号值。):

"00003",6,"D","C20",-70.10,42.06,90.00,"119082",0,1,2,0,0,"",0,"001"
"00004",6,"D","C21",-67.91,42.06,90.00,"119082",0,1,2,0,0,"",0,"001"
"00005",13,"D","C23",-66.91,59.07,180.00,"119083",0,1,2,0,0,"",0,"002"
"00006",13,"D","R10",-77.32,66.88,90.00,"119040",0,1,2,0,0,"",0,"003"
"00007",13,"D","L3",-77.64,77.48,90.00,"119085",0,1,2,0,0,"",0,"004"
"00008",20,"D","D1",-62.91,103.77,0.00,"119084",0,1,2,0,0,"",0,"005"
"00009",21,"D","D1",-25.83,103.77,0.00,"119084",0,1,2,0,0,"",0,"005"
"00010",14,"D","L3",-40.56,77.48,90.00,"119085",0,1,2,0,0,"",0,"004"
"00011",14,"D","R10",-40.24,66.88,90.00,"119040",0,1,2,0,0,"",0,"003"

现在我需要做的是检查另一个 .txt 文件。假设它被称为“DATABASE.txt”,看看这些部件号是否已经存在。这个数据库文件看起来像这样:

119082:    125663-D2, 123456-A1,
119083: 125663-D2,
119085: 125663-D2, 123456-A1, 987654321-Z11234, 1111111-B50

因此,在 DATABASE.txt 文件和上面打开的文件中,我想检查打开的文件中的所有部件号,看看它们是否存在于数据库中。

  • 如果部件确实存在,我想将文件名(输出文件)连接到部件号所在行的末尾。

  • 如果该部分不存在,我想将该部分添加到文件中并使用 list.Sort() 对文件进行排序。

我不确定该怎么做,有人可以帮忙吗?


到目前为止,这是我的一些代码:

List<string> partNumberLines = new List<string>();
string file = openFile.FileName;
string splitFile = file.Split('\\');
string[] savedName = splitFile[splitFile.Length - 1].Split('.');
string[] lineNumber = savedNamed[2].Split('-');
string fileName = savedNamed[1] + "-" + lineNumber[0] + ".txt";

foreach (string line in fileList)
{
string[] splitLine = line.Split('\n');
for (int i = 0; i < splitLine.Length; i++)
{
string tempSplit = splitLine[i].Split(','); // splits each line by commas
if (tempSplit.Length.Equals(16))
{
tempSplit[7] = tempSplit[7].TrimStart('"'); //trims the quotes from the part numbers
tempSplit[7] = tempSplit[7].TrimEnd('"');
}
}
}
partNumberLines = partNumberLines.Distinct().ToList(); //gets rid of duplicate partnumbers in one file.

所以我的代码是获取所有零件号和文件名。我只是不知道如何打开现有文件(如果不存在,则创建它)并搜索文件和在 List: partNumberLines 中查找匹配项。如果匹配,则将文件名 连接到当前行。如果不匹配,则创建一个新行并添加部件号和文件名,然后按部件号对文件进行数字排序。

谁能帮我解决这个问题?

最佳答案

希望你还没有放弃。这是一个示例类。我已经从上一篇文章中完成了它。将上面的数据库数据保存到 database.txt 并将零件数据保存到 parts.txt 并修改路径以查看其工作原理。希望对你有帮助。如果您还有其他问题,请随时提问。

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
private class DataBaseRecord
{
public string PartNumber { get; set; }
public List<string> FileNames { get; set; }
public DataBaseRecord(string _PartNumber, List<string> _FileNames)
{
PartNumber = _PartNumber;
FileNames = _FileNames;
}
}

private class DataBase
{
public string databaseFile { get; set; }
List<DataBaseRecord> records;
public DataBase(string _databaseFile)
{
databaseFile = _databaseFile;
records = new List<DataBaseRecord>();
}
public void AddRecord(string partNumber, string fileName)
{
if (string.IsNullOrWhiteSpace(partNumber))
return;

if (string.IsNullOrWhiteSpace(fileName))
return;

bool exists = records.Count(x => x.PartNumber == partNumber) > 0;
if (!exists)
{
records.Add(new DataBaseRecord(partNumber, new List<string>() { fileName }));
}
else
{
var record = from x in records where x.PartNumber == partNumber select x;
foreach (DataBaseRecord dbr in record)
{
exists = dbr.FileNames.Count(x => x == fileName) > 0;
if (!exists)
dbr.FileNames.Add(fileName);
}
}
}
public void Read()
{
// read all database records into data structure
using (StreamReader sr = new StreamReader(databaseFile))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
string partNumber = line.Split(':')[0].Trim();
if (partNumber[0] == '\"')
partNumber = partNumber.Substring(1, partNumber.Length - 2);
string[] files = line.Split(new string[]{":"}, StringSplitOptions.None)[1].Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries);
List<string> fileNumbers = new List<string>();
foreach (String file in files)
{
if (!string.IsNullOrWhiteSpace(file))
{
fileNumbers.Add(file.Trim());
}
}
records.Add(new DataBaseRecord(partNumber, fileNumbers));
}
}
}
public void Write()
{
// write out database using the records
var sortedRecords = from x in records orderby x.PartNumber select x;
using (StreamWriter sw = new StreamWriter(databaseFile))
{
foreach (DataBaseRecord record in sortedRecords)
{
string line = record.PartNumber + ": ";
for (int index = 0; index < record.FileNames.Count; index++)
{
line += record.FileNames[index];
if (index < record.FileNames.Count - 1)
line += ", ";
}
sw.WriteLine(line);
}
}
}
}

static void Main(string[] args)
{
// replace with name of your database
DataBase db = new DataBase(@"C:\Users\jondoe\Desktop\DataBase.txt");
db.Read();

// replace with list of your parts files
string[] partsFiles = new string[] { @"C:\Users\jondoe\Desktop\parts.txt" };
foreach (string partsFile in partsFiles)
{
using (StreamReader sr = new StreamReader(partsFile))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
string partNumber = line.Split(new string[] { "," }, StringSplitOptions.None)[7];
if (partNumber[0] == '\"')
partNumber = partNumber.Substring(1, partNumber.Length - 2);
db.AddRecord(partNumber, Path.GetFileNameWithoutExtension(partsFile));
}
}
}

db.Write();
}
}
}

编辑

如果你想要一个静态数据库并且你想让用户选择一个零件文件,那么你可以在按钮点击事件中这样做:

private void btnOpenFile_Click(object sender, EventArgs e)
{
DataBase db = new DataBase(@"C:\Users\JonDoe\Desktop\DataBase.txt");
db.Read();

using (OpenFileDialog ofd = new OpenFileDialog())
{
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (StreamReader sr = new StreamReader(ofd.FileName))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
string partNumber = line.Split(new string[] { "," }, StringSplitOptions.None)[7];
if (partNumber[0] == '\"')
partNumber = partNumber.Substring(1, partNumber.Length - 2);
db.AddRecord(partNumber, Path.GetFileNameWithoutExtension(ofd.FileName));
}
}
db.Write();
}
}
}

关于c# - 文件检查和打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437514/

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