2013-06-05 86 views
2

我有text1.txt和有内容按如下:如何将两个文本(.txt)文件合并为一个文件并将相同的内容区分开来?

longitude,latt,u,70772,xxxx 
31, 121, -10.2 
31, 122, -20.9 
31, 123, 40.8 
. 
. 
44, 131, -44.1 

我有text2.txt和有内容按如下:

longitude,latt,v,70772,xxxx 
31, 121, 12.1 
31, 122, 32.4 
31, 123, -2.5 
. 
. 
44, 131, 7.3 

正如你所看到的,text1.txttext2.txt共享一些相同的共性。

1共同点:每个文本文件的第一行应该被忽略,因为包含非重要信息

第二个共同点:每个文本文件包含相同的经度和lattidue价值,这是

31 , 121 , x 
31 , 122 , x 
31 , 123 , x 
. 
. 
44 , 131 , x 

我的目标是text1.txttext2.txt合并为result.txt,并具有以下结果:

31, 121, -10.2, 12.1 
31, 121, -20.9, 32.4 
31, 123, 40.8, -2.5 
. 
. 
44, 131, -44.1, 7.3 

参照这个源MergeTwoTextFile我已经知道如何合并两个文本文件。但我不知道的是,如何合并具有特定条件的两个文本文件。

我希望能做点像concatdistict,有什么想法吗?

更新: 3 UI按钮

enter image description here

代码打开文件按钮

private void toolStripBtnOpenV_Click(object sender, EventArgs e) 
{ 
     toolStripBtnOpenV.Enabled = false; 

     openFileDialog1.FileName = ""; 

     openFileDialog1.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; 

     if (openFileDialog1.ShowDialog() != DialogResult.OK) 
      return; 

     v_filePath = openFileDialog1.FileName; 

     if (toolStripBtnOpenU.Enabled == false) 
     { 
      toolStripBtnMerge.Enabled = true; 
     } 
} 

内MergeUV button_click事件,不喜欢什么SamiHuutoniemi建议,除了改变这样的第一线:

List<string> filelist = new List<string>() { v_filePath , u_filePath }; 

这将需要minimun 20分钟写输出文件,如果你的文件大小为> 5MB

+0

你累了什么? –

+0

我希望我可以试试。我会在回到办公室时更新一些示例代码。首先发布问题,仅仅是为了得到一些想法 – jhyap

回答

2

你可以同时读取TEXTFILES,数据保存为的Tuple<int, int, List<double>>列表(在那里你必须在这个意义上的元组“独一无二”的那没有两个元组共享这两个整数)。然后输出一个文本文件,在其中打印格式中的所有元组。

这完成了我认为你想要做的事情。

List<string> filelist = new List<string>() { "text1.txt", "text2.txt" }; 
List<Tuple<int, int, List<double>>> dataList = new List<Tuple<int, int, List<double>>>(); 

foreach (var file in filelist) 
{ 
    string line; 
    using (TextReader tr = new StreamReader(file)) 
    { 
     tr.ReadLine(); //skip header 
     while ((line = tr.ReadLine()) != null) 
     { 
      var tokens = line.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); 
      int longitude = int.Parse(tokens[0]); 
      int latitude = int.Parse(tokens[1]); 
      double value = double.Parse(tokens[2], CultureInfo.InvariantCulture); 

      Tuple<int, int, List<double>> t = dataList.Where(x => (int)x.Item1 == longitude && (int)x.Item2 == latitude).FirstOrDefault(); 
      if (t == null) 
      { 
       dataList.Add(new Tuple<int, int, List<double>>(longitude, latitude, new List<double>() { value })); 
      } 
      else 
      { 
       t.Item3.Add(value); 
      } 
     } 
    } 
} 

using (TextWriter tw = new StreamWriter("output.txt")) 
{ 
    foreach (var t in dataList) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append(String.Format("{0}, {1}, ", t.Item1, t.Item2)); 
     foreach (var value in t.Item3) 
     { 
      sb.Append(String.Format("{0}, ", value)); 
     } 

     tw.WriteLine(sb.ToString()); 
    } 
} 
+1

我只是试着解决这个问题。完全符合我的要求。然而,我在'text1.txt'和'text2.txt'中有> 20,000行,它需要太多的时间才能完成'tr.ReadLine':( – jhyap

0

要只是将它们合并,而不每个的第一行,你可以试试这个一班轮:如果你需要他们独特的纯行由行比较级

File.WriteAllLines("result.txt", File.ReadLines("text1.txt").Skip(1).Concat(File.ReadLines("text2.txt").Skip(1))); 

File.WriteAllLines("result.txt", File.ReadLines("text1.txt").Skip(1).Concat(File.ReadLines("text2.txt").Skip(1)).Distinct()); 
+0

这可能是我想要的。更新基于此解决方案的示例代码 – jhyap

+0

他并不是要求将两个文件添加到彼此 - 他正在讨论逐行合并 –

+0

哇,此解决方案适用于连接2个文件而不需要重复的行,但OP的要求不同。:) –

2

是这样的吗?

var file1 = File.ReadAllLines("path1"); 
var file2 = File.ReadAllLines("path2"); 

var result = new List<string>(); 

//Skip line 0 
for (int i = 1; i < file1.Length; i++) 
{ 
    //Get the values from each correseponding file 
    var file1Values = file1[i].Split(',').Select(v => v.Trim()); 
    var file2Values = file2[i].Split(',').Select(v => v.Trim()); 

    //Get distinct values & join 
    result.Add(string.Join(",", file1Values.Union(file2Values))); 
} 

File.WriteAllLines("resultpath", result); 
+0

我怀疑你所声称的那条路线是不会有这样的事情的。但否则,这是一个好的开始。 – DonBoitnott

+0

它没有。 OP希望第一行有31,121,-10.2,12.1',并给出'31,121,-10.2,31,121,12.1'。 – DonBoitnott

+0

啊 - 我的意思是联盟() - 好点。 –

相关问题