2013-02-19 132 views
1

说我有2个文本文件:Ç - 合并两个文本文件

A.TXT:

Param1: Value1 
Param2: Value2 
     . 
     . 
     . 
     . 
ParamM: ValueM 

B.txt

Param1: Value1 
Param2: Value2 
     . 
     . 
     . 
     . 
ParamN: ValueN 
  • 参数的数量在A.txt,即M可以大于,小于或等于B.txt中的参数的数量,即N
  • A.txtB.txt中相同参数的值不必相同。
  • 中号Ñ大概可以达到200
  • 参数名是任意的最大值。他们没有号码。以上只是为了举例说明。

我的目标是要合并A.TXTB.txt。如果发生任何冲突,我有一个文件/内存中的存储区,指定哪一个优先。

例如,

A.TXT可能看起来像:

Path: C:\Program\Files 
Data: ImportantInfo.dat 
Version: 1.2.3 
Useless: UselessParameter.txt 

B.txt可能看起来像:

Path: C:\ProgramFiles 
Data: NotSoImportant.dat 
Version: 1.0.0 
Useful: UsefulParameter.txt 

最后文本文件 应该是这样的:

Path: C:\ProgramFiles 
Data: ImportantInfo.dat 
Version: 1.2.3 
Useful: UsefulParameter.txt 

现在我的方式来思考是这样的:

get a line from A.txt 
get a line from B.txt 
tokenize both by ":" 
compare param names 
if same 
    write A.txt's value to Result.txt 
else if different 
    write A.txt's line into Result.txt 
    write B.txt's line into Result.txt /* Order doesn't really matter */ 
repeat above steps until end of both text files 

这种方法不照顾时A.TXT具有一定的参数和B.txt的没有。如果存在一些轻量级的库/ API来执行此操作将非常有帮助。我不在寻找命令行工具(感谢做system()调用的开销)。

谢谢!

+2

为什么不使用BeyondCompare? – 2013-02-19 08:52:27

+0

为什么文件'A.txt'的'Useless'行不出现最终结果? – 2013-02-19 08:58:27

+1

这对于具有Map datatyp的语言来说会容易得多: 1.读取所有B并存储在Map中。 2.读取所有A并存储在相同的地图中(自动替换任何重复项) 3.将地图输出到文件。 – 2013-02-19 09:00:20

回答

2

这对于具有Map数据类型的语言来说会容易得多。 我会做这样的:

  1. 阅读所有的B和键值字符串存储在内存中

  2. 读A和每个关键是覆盖值(如果存在的话)或增加它(如果它不)

  3. 输出的键值文件

+0

通过访问'std :: map',实现这一点会更容易*,但即使在C中,这种方法仍然可以工作。您只需实施名称查找并手动复制检测/替换即可。 – 2013-02-20 01:06:59

+0

是的,算法仍然是一个健全的。对于小文件(高达几千条),不需要散列密钥。 – 2013-02-20 08:41:47