我有一堆需要转换的文件。起始文件如下所示:
Well ID,Error code,Sample Barcode
A1,0,THC_CAL1
B1,0,THC_CAL2
C1,1,THC_CAL3
D1,0,THC_CAL4
E1,0,THC_QC1
F1,0,THC_QC2
G1,0,THC_QC3
H1,0,THC_QC4
A2,0,BLANK0609
B2,0,AA178121
C2,0,CC37815
D2,0,BLANK0610
E2,0,CC37819
F2,0,N150680
G2,0,BLANK0611
H2,0,AA127900
A3,0,AA26940
B3,0,BLANK0612
...........
输出需要如下所示:
A01 THC_CAL1
B01 THC_CAL2
D01 THC_CAL4 //please note that c1 is gone since it did not have a 0 in the middle column
E01 THC_QC1
F01 THC_QC2
G01 THC_QC3
H01 THC_QC4
A02 BLANK0609
B02 AA178121
C02 CC37815
D02 BLANK0610
E02 CC37819
F02 N150680
G02 BLANK0611
H02 AA127900
A03 AA26940
B03 BLANK0612
H10 BLANK0234 //please notice that there is H10 and not H010
将此文件读入变量然后将其输出到新文件中的最佳方法是什么?我应该逐行阅读,还是应该将其读入数据表?
答案 0 :(得分:2)
我会一次读取一行文件并检查这个正则表达式:
^([A-Z]{1})([0-9]{1}),0,([A-Z0-9_]+)$
如果该行匹配,我会使用正则表达式组将新格式输出到新文件。 (我确定它不是最好的正则表达式)
基本上,这是你需要做的,虽然我不清楚你的例子中的最后一行输出来自哪里。
using (StreamWriter writer = new StreamWriter("out.out")) // file to write to
{
using (StreamReader reader = new StreamReader("input.dat")) //file to read from
{
Regex regex = new Regex(@"^([A-Z]{1})([0-9]{1}),0,([A-Z0-9_]+)$");
string line;
while (reader.Peek() > 0)
{
line = reader.ReadLine();
if (regex.IsMatch(line))
{
writer.WriteLine(string.Format("{0}0{1} {2}", regex.Match(line).Groups[1], regex.Match(line).Groups[2], regex.Match(line).Groups[3]));
}
}
}
}
答案 1 :(得分:1)
使用StreamReader读取一行一行。解析您需要的信息。构造新行并使用StreamWriter写出另一个文件。一次完成这一行。
答案 2 :(得分:0)
使用OLEDB读入数据表:
http://www.switchonthecode.com/tutorials/csharp-tutorial-using-the-built-in-oledb-csv-parser
使用OLEDB写入带制表符分隔的文件(大约一半):
http://support.microsoft.com/kb/306023
不要让“Excel”部分抛出你... Excel使用相同的提供程序(OleDb)作为文本文件。您只需要为文本文件构建正确的连接字符串:
http://www.connectionstrings.com/textfile
OleDb提供商很开心。
答案 3 :(得分:0)
棘手的部分是编写可靠的映射规则,并且没有任何内容可以帮助您。有很多模式匹配&要使用的转换实用程序,但对于这个简单的东西,.Net 3.0&核心库包含足够多的工具来验证,格式化,过滤和排序您需要的任何方式。
所以我会构建类型来明确表示数据。将每一行解析为您的类型的实例。创建一个.ToNewType()方法或NewTypeClass(oldTypeInstance),其关注点是从旧格式映射到新格式。
一旦有了List,很容易将其保存到文件中。