【问题标题】:Concatenate Multiple Data Files [closed]连接多个数据文件[关闭]
【发布时间】:2017-03-03 20:38:44
【问题描述】:

我有几个如下所示的数据文件:

HR0
012312010
001230202

HR1
012031020
012320102
012323222
012321010

HR2
321020202
...

解释一下:有一行定义字段(HR“n”),可变数量的行与四进制数(321020202),然后是两个字段之间的额外换行符。我想结合等效的人力资源领域。所以从某种意义上说,我想把这些文件压缩成一个大文件。我认为使用 sed 是答案,但我不知道从哪里开始。

我正在考虑在 python 或 c++ 程序上使用 shell 脚本,因为我觉得它在编写和执行方面可能会更快。想法?

【问题讨论】:

  • 过早优化。编译的 C++ 程序将是最快的。
  • 你想如何处理冲突?如果不同文件 HR0 中有 2 000000013 个元素怎么办?
  • @JonathanMee 由于数据的创建方式,所有元素都是独一无二的。因此,如果我正确理解您的问题,则无需检查。

标签: python c++ shell sed text-files


【解决方案1】:

这在 C++ 中很容易做到,如果你有 C++17 就更容易做到。 您可以编写一个函数来读取multimap<int, int>,例如:

multimap<int, int> read(istream& input) {
    multimap<int, int> output;
    string i;

    while(input >> i) {
        const auto key = std::atoi(data(i) + 2);

        transform(istream_iterator<int>(input), istream_iterator<int>(), inserter(output, begin(output)), [key](const auto value){ return make_pair(key, value); });
        input.clear();
    }
    return output; 
}

因此,您将使用每个文件的 ifstream 调用该函数,并使用 merge 将返回值转储到累积的 multimap&lt;int, int&gt; output 中。

然后你只需将output 转储到你的输出文件,假设它是用ofstream filep 打开的,你可以这样转储:

auto key = cbegin(output)->first;

filep << key << ":\n" << setfill('0');

for(const auto& it : output) {
    if(it.first == key) {
        filep << '\t' << setw(9) << it.second << endl;
    } else {
        key = it.first;
        filep << key << ":\n\t" << setw(9) << it.second << endl;
    }
}

我在这里写了一个只涉及一个文件的实时示例:http://ideone.com/n47MnS

【讨论】:

  • 哇,太棒了!非常感谢!!
  • @Jeff Yup,C++11/14/17 对语言进行了如此多的改进,现在它在易用性方面与 Python 和脚本语言非常有竞争力,但仍保留了 C++ 的低级功能一直备受推崇。无论如何...如果这能解决您的问题,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 2020-05-13
  • 1970-01-01
  • 2011-10-19
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多