.txt 文件中特定数据列的提取

时间:2021-04-14 20:15:51

标签: c++

我有一个包含 4 列数据的文本文件 (data.txt)(第 1 列是时间,第 2、第 3 和第 4 列是特定数据),我想编写一个程序来提取它包含的通道之一,通过它的名字调用它,所以它创建一个只有 2 列的新文件(第一次,第二次提取的频道)。 命令行应该是 extract data.txt channel_2.txt

我是 C++ 的新手,我知道读/写的东西(ofstream/ifstream/stream),但我不确定我可以用这些创建一个新的 .txt 文件(具有不同的原始名称)类。

我开始写一些代码,它非常基础且不完整,但正如我所说,我没有 C++ 经验(所以请全面:))

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main() 
{   
    int index
    cout << "enter the index of the column to keep :  " << endl;
    cin >> index;
    
    ???
    
    
    // open file for writing  
    string filename("data.txt");
    ofstream file(filename._str());
    if(file)
    {
        file << data << endl;
        file.close();
    }
    else
    { 
        cerr << "impossible to open file" << endl;  
    }
    return 0;
}

这是 data.txt 文件的样子:

%MC_DataTool ASCII conversion
%
%t              El 12           El 45           El 86
%[ms]           [microV]        [microV]        [microV]
0.000           0.83            -4.58           3.75
0.100           -8.33           -2.08           2.50
0.200           -10.00          -0.42           0.83
0.300           -9.58           -3.75           -8.75
0.400           -2.50           -2.50           -5.00
0.500           -5.42           -2.92           -9.58
...
59999.800       -3.33           2.50            -2.50
59999.900       1.67            -1.25           -2.08
60000.000       -2.92           -0.42           -0.42  

理想情况下,输出应该如我所解释的那样:

%time channel_2 
0.000000 -4.580000 
0.100000 -2.080000 
0.200000 -0.420000 
0.300000 -3.750000
...

非常欢迎任何帮助、评论或建议! 谢谢大家。

1 个答案:

答案 0 :(得分:1)

这是一种方法:

std::vector<std::vector<double>> database;
typedef std::vector<double> DB_Row;
//...
double column1, column2, column3, column4;
while (file >> column1 >> column2 >> column3 >> column4)
{
    DB_Row row;
    row.push_back(column1);
    row.push_back(column2);
    row.push_back(column3);
    row.push_back(column4);
    database.push_back(row);
}

以上代码将您的数据作为矩阵或二维数组读入。
要访问第 4 行的第 2 列:

double value = database[3][1]; // Remember, 0 based indexing

编辑 1:访问所有行的第 2 列
提醒,第 2 列由索引值 1 表示(0 是第 1 列的索引)。

const unsigned int index_column_2 = 1;
const unsigned int ROW_COUNT = database.size();
for (unsigned int row = 0u; row < ROW_COUNT; ++row)
{
    std::cout << "value at row: " << row
              << ", column 2: " << database[row][index_column_2]
              << "\n";
}