我有一个文件,我已修剪,只保留其中的一些数据。此文件是我要添加到第二个文件末尾的文件。这是第一个文件的样子:
147221
147486
147514-1
147502
147503
...
我想把它连接到一个看起来像这样的文件的末尾:
some text ... more text
text text: Description
Ln PPN PD Qty Units Comment MNAME MfMCODE
some comment
1 EC5547 PCB: SB5500 LCD DISPLAY CTRL +RHS 1.00 EA REV 07 OR LATER
2 EC0303 FERRITE BEAD: 200MA 1000Z0.8 SM0603 +RHS 2.00 EA FB2 FB4 MURATA BLM18RK102SN1
3 EC0304 FERRITE BEAD: 2000MA 220Z0.05 SM0805 +RHS 2.00 EA FB1 FB5 MURATA BLM21PG221SN1
4 EC7727 IC: LTC2851 RS422 XCVR SO8 +RHS 1.00 EA U10 LINEAR TECHNOLOGIES LTC2851CS8#PBF
LINEAR TECHNOLOGIES LTC2851IS8#PBF
MAXIM MAX3077EASA+
MAXIM MAX3077EESA+
DNP C20 C24 C25 C27 C44 C60 C62 J1 J5 J6 J7 J8 J11 R2 R20
R29 R33 R53 R54 R89 R91 R94 R96 R107 R108 R109 C63 R61
J12 J13 U7 TP1-20 TP22-28 TP34-36 TP38-39 TP41 TP43-54
TP56-96
5 EC5071 CONN: HEADER RA 0.1x10 0.025 SQ +RHS 1.00 EQ J2 SAMTEC TSW-110-08-S-S-RA
...
通过匹配来查看第二个文件行是否以1,2,3,4,5等开头...然后以相同的顺序添加第一个文件中的行。
我的意思是它看起来像这样:
some text ... more text
text text: Description
Ln PPN PD Qty Units Comment MNAME MfMCODE
some comment
1 EC5547 PCB: SB5500 LCD DISPLAY CTRL +RHS 1.00 EA REV 07 OR LATER 147221
2 EC0303 FERRITE BEAD: 200MA 1000Z0.8 SM0603 +RHS 2.00 EA FB2 FB4 MURATA BLM18RK102SN1 147486
3 EC0304 FERRITE BEAD: 2000MA 220Z0.05 SM0805 +RHS 2.00 EA FB1 FB5 MURATA BLM21PG221SN1 147514-1
4 EC7727 IC: LTC2851 RS422 XCVR SO8 +RHS 1.00 EA U10 LINEAR TECHNOLOGIES LTC2851CS8#PBF 147502
LINEAR TECHNOLOGIES LTC2851IS8#PBF
MAXIM MAX3077EASA+
MAXIM MAX3077EESA+
DNP C20 C24 C25 C27 C44 C60 C62 J1 J5 J6 J7 J8 J11 R2 R20
R29 R33 R53 R54 R89 R91 R94 R96 R107 R108 R109 C63 R61
J12 J13 U7 TP1-20 TP22-28 TP34-36 TP38-39 TP41 TP43-54
TP56-96
5 EC5071 CONN: HEADER RA 0.1x10 0.025 SQ +RHS 1.00 EQ J2 SAMTEC TSW-110-08-S-S-RA 147503
....
的 THOUGHTS 的
非常好:
的问题 的
答案 0 :(得分:1)
这将从两个输入文件中读取并写入第三个。关于正则表达式模式,如果一行以任何正整数(不包括零)开始,后面跟一个空格字符(例如,像“10某些非数字文本”这样的行将匹配),这将起作用。
using (StreamReader sr1 = new StreamReader(@"C:\Temp\Content.txt"))
using (StreamReader sr2 = new StreamReader(@"C:\Temp\Numbers.txt"))
using (StreamWriter sw = new StreamWriter(@"C:\Temp\Combined.txt"))
{
string curLine;
while ((curLine = sr1.ReadLine()) != null)
{
if (Regex.IsMatch(curLine, "^[1-9][0-9]*\s"))
{
sw.WriteLine(curLine + " " + sr2.ReadLine());
}
else
{
sw.WriteLine(curLine);
}
}
}
答案 1 :(得分:1)
假设您感兴趣的行总是从一些没有前导空格的数字开始,我只是使用正则表达式来验证该行是您正在寻找的行(或者甚至只是一个简单的检查如果该行的第一个字符是使用Char.IsDigit()
)的数字,则在找到后进行任何处理。
using (var dataReader = File.OpenText(@"path\to\data\file"))
using (var labelReader = File.OpenText(@"path\to\label\file"))
using (var writer = File.CreateText(@"path\to\output\file"))
{
string line;
while ((line = dataReader.ReadLine()) != null)
{
if (Regex.IsMatch(line, @"^\d+"))
{ // found the line (append label)
writer.WriteLine(line + " " + labelReader.ReadLine());
}
else
{ // not the line (pass through)
writer.WriteLine(line);
}
}
}
答案 2 :(得分:0)
不确定正则表达式,但你可以使用sting函数来执行if-else语句(可能不是一个可靠的但是可以工作)
string str = "1 EC5547 PCB: SB5500 LCD DISPLAY CTRL +RHS 1.00 EA REV 07 OR LATER";
string str1 = "147221";
if (str.StartsWith("1"))
{
str += str1;
}
答案 3 :(得分:0)
输出很简单,以后我们可以担心。作为一般方法,我会将您的第一个文件编号加载到一个数组中(如果您愿意,可以使用某种列表或向量,但我认为没有必要)。在解析从0开始的第二个文件时有一个计数器。当您找到要输出的行时,请使用计数器作为字符串数组的索引,以便按顺序获取下一个字符串。写完号码后,递增你的柜台。将其写回文件可以在迭代时完成。这样的事情(没有经过测试!!!这只是为了表明这个想法。)应该有效:
StringBuilder newFile = new StringBuilder();
string[] file = File.ReadAllLines(@"file2path");
foreach (string line in file)
{
if (!regex evaluation here!)
{
//append your number and increment counter here
string temp = line.Replace(oldString, appendedString);
newFile.Append(temp + "\r\n");
continue;
}
newFile.Append(line + "\r\n");
}
File.WriteAllText(@""file2path", newFile.ToString());