我需要合并两个纯文本文件,按照 timeStamp 排序,从文件中的一列开始。
sample_A.txt
05:37:58 01:00 0 0 |05:32:00|93328|5352| |Description 1
05:43:58 01:00 0 0 |05:49:40|99256|5357| |Description 2
05:44:58 00:30 0 0 |05:50:40|99301|5358| |Description 3
sample_B.txt
04:58:11 00:02 0 0 |04:58:55|58787|0335| |Description A
04:58:12 01:01 0 0 |04:59:00|57701|0336| |Description B
06:09:37 01:00 0 0 |06:10:00|58181|0348| |Description C
output_File.txt (这是合并后文件的样子)
04:58:11 00:02 0 0 |04:58:55|58787|0335| |Description A
04:58:12 01:01 0 0 |04:59:00|57701|0336| |Description B
05:37:58 01:00 0 0 |05:32:00|93328|5352| |Description 1
05:43:58 01:00 0 0 |05:49:40|99256|5357| |Description 2
05:44:58 00:30 0 0 |05:50:40|99301|5358| |Description 3
06:09:37 01:00 0 0 |06:10:00|58181|0348| |Description C
时间戳是前8列,例如: 在文件sample_A.txt:
05:37:58
05:43:58
05:44:58
这是我的代码,但它只使用分隔符将文件附加到同一行,我可以请一些帮助吗?
感谢。
string[] files = new string[] { @"c:\temp\sample_A.txt", @"c:\temp\sample_B.txt" };
var hash = new Dictionary<string, Dictionary<string, bool>>();
foreach (var file in files)
{
string[] fileContents = File.ReadAllLines(file);
foreach (string line in fileContents)
{
string[] a = line.Split('|');
if (!hash.Keys.Contains(a[0]))
hash[a[0]] = new Dictionary<string, bool>();
hash[a[0]][a[1]] = true;
}
}
foreach (var key in hash.Keys)
Console.WriteLine(key + "," + string.Join(",", hash[key].Keys.ToArray()));
答案 0 :(得分:1)
我认为你可以简化。你在这里需要什么样的独特性吗?
如果没有,你根本不需要所有的hashmap / etc东西,你可以只读取所有文件并将它们合并到一个大的列表中,然后排序并输出排序的版本?
string[] files = new string[] { @"c:\temp\sample_A.txt", @"c:\temp\sample_B.txt" };
var merged = new List<string>();
foreach (var file in files)
{
string[] fileContents = File.ReadAllLines(file);
Collections.addAll(merged, fileContents);
}
Collections.sort(merged);
foreach (string line in merged)
{
Console.WriteLine(line);
}
如果你只需要比较时间戳的前8个字符,你可以创建+将自定义比较器传递给sort方法吗?
如果您需要时间的唯一性,一旦对列表进行排序,您可以查看最后一项和当前(或当前和下一项),如果时间戳相同,则跳过编写项目。