通过TimeStamp合并两个文本文件

时间:2016-04-22 22:31:22

标签: c#

我需要合并两个纯文本文件,按照 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()));

1 个答案:

答案 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方法吗?

如果您需要时间的唯一性,一旦对列表进行排序,您可以查看最后一项和当前(或当前和下一项),如果时间戳相同,则跳过编写项目。