重新排列文本文件中的行列

Posted

技术标签:

【中文标题】重新排列文本文件中的行列【英文标题】:rearrange columns of lines in text file 【发布时间】:2013-09-27 20:02:46 【问题描述】:

我有一个包含 200 行的文本文件,如下所示:

1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200 
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 

我的代码按照每个参赛者的出生年份而不是上面示例中的时间对这些行进行排序。所以现在这些行是这样排序的:(只有更多的行)

2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 
1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200

我的问题是我现在如何列出三件事:年份 - 名称 - 时间......这样这两行看起来像这样:

1987   Gudni Pall Palsson    4:52:25  
1979   Orvar Steingrimsson   4:48:08

到目前为止,我的代码以正确的顺序对行进行排序:

#include <iostream> //for basic functions
#include <fstream> //for basic file operations
#include <string> //for string operations
#include <map> //for multimap functions

using namespace std;

int main ()

ifstream  in("laugavegurinn.txt", ios::in);
ofstream out("laugavegurinn2.txt");
string str;
multimap<int, string> datayear; //creates multimap linking each line to year

in.ignore(80);//ignores header of the file - 80 characters - to escape problems with while loop

// while (getline(in,str)) 
 //   string name = str.substr(18,30);
   // string time = str.substr(8,7);

//


while (getline(in,str)) 
    int year = stoi(str.substr(54, 4));
    datayear.insert(make_pair(year,str)); //insert function and pairs year and string 


for (auto v : datayear)
    out << v.second << "\n";

in.close();
out.close();

【问题讨论】:

我无法创建变量名称和时间,然后将它们添加到行中:out 这个问题的第三个版本应该是什么?首先是this。我想知道这是XY 的问题吗? 如果所有行都以相同的顺序排列,您可以使用 #include stringstream 获取字符串的每个单个信息。使用一些 std::vector 构造可能会排列所有信息,然后您只需需要打印出正确的索引。我没把你的问题弄对吗? 哈哈对不起。我已经差不多完成了这个项目,但是为了让它看起来不错,我想安排这些列:年份 - 名称 - 时间......虽然我非常感谢我得到的所有帮助到目前为止,这使我能够首先按年份对数据进行排序。 @Martin,是的,你做到了。我将尝试为每条信息创建向量。这不是必需品,我只是想尽可能地修复我的解决方案。谢谢 【参考方案1】:

我建议您使用一个类或结构,其中一个成员代表表中的每一列。一个实例代表一行。

从这个类中,您可以编写方法以按您希望的任何顺序显示数据。

您可以编写排序类来按任何成员对对象进行排序。

在 *** 中搜索“从文件中读取”以获取有关从文件中读取数据的示例。

【讨论】:

【参考方案2】:

您将每一行视为单个字符串:重新排列字段的唯一方法是提取每个字段并分别输出。我的示例使用带有您要输出的字段的结构。

#include <iostream> //for basic functions
#include <fstream> //for basic file operations
#include <string> //for string operations
#include <map> //for multimap functions

using namespace std;

typedef struct 
  int year;
  string name;
  string time;
 Fields;

int main ()

  ifstream  in("names.txt", ios::in);
  ofstream out("namesout.txt");
  string str;
  multimap<int, Fields> data; //creates multimap linking each line to year

  in.ignore(80);

  Fields tempField;

  while (getline(in,str)) 
    tempField.year = stoi(str.substr(51, 4));
    tempField.name=  str.substr(15, 30);
    tempField.time=  str.substr(5, 8);
    data.insert(make_pair(tempField.year,tempField)); //insert function and pairs year and string
  

  for (auto v : data)
    out << v.second.year << " " << v.second.name  << " " << v.second.time<< "\n";

  in.close();
  out.close();

【讨论】:

【参考方案3】:

没有真正简单的方法可以做到这一点。我认为您应该做的是一次读取每一行并将它们解析为某种结构。然后根据需要显示/写入适当的项目。

棘手的部分是当您尝试解析人名时。因为一个人的名字可能由多个字符串组成。从而使名称部分的识别变得困难。

vinaut说的差不多。

【讨论】:

【参考方案4】:
$ cat file
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870
1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200

$ sed -r 's/[[:digit:]]+[[:space:]]+([[:digit:]:]+)[[:space:]]+(.*[^[:space:]])[[:space:]]+([[:digit:]]4)[[:space:]].*/\3 \2 \1/' file
1987 Gudni Pall Palsson 4:52:25
1979 Orvar Steingrimsson 4:48:08

【讨论】:

以上是关于重新排列文本文件中的行列的主要内容,如果未能解决你的问题,请参考以下文章

QT中怎样读取中文文本文件!

delphi写多行文本文件操作

文件读取

打开多行文本文件并仅读取其中的特定行。并将值发送到文本框

C语言如何判断文本文档的结束

打开 VS Code 并打开一个空白文本文件