gpt4 book ai didi

c++ - 用 C++ 解析巨大的 csv 文件

转载 作者:行者123 更新时间:2023-11-27 22:47:27 25 4
gpt4 key购买 nike

我为了模拟我的网络,我使用了一个大小在 5 到 30 GB 之间的跟踪文件(csv 文件)。csv 文件是基于行的,其中每一行包含多个由空格分隔的字段,并形成网络数据包的信息:

3     53      4    12    1     1  2  6

由于文件的大小可能达到数GB(百万行),是将其分成小块myfile00.csv、myfile01.csv...更好,还是我可以在硬盘驱动器上处理整个文件而无需载入内存?我想在特定时间逐行读取文件,这是模拟的时钟周期,并获取行中的所有信息以创建 omnet++ 消息。

packet MyTrace::getpacket() {
int id; // first field
int cycle; // second field
int source; // third field
int destination; // fourth field
int numberofDep; // fifth field
std::list<int> listofDep; // remaining fields

if (!traceFile.is_open()) {
// get id
// get cycle
// ....
}

任何建议都会有所帮助。

编辑:

  string line;
ifstream myfile ("BlackSmall.csv");
int currentline=0 ;
if (myfile.is_open())
{
while (getline(myfile, line)) {

istringstream ss(line);
string request;
int id, cycle, source , dest, srcType, destType, packetSize, dependency;
int listdep;
std::list<int> dep;
ss >> id;
ss>> cycle;
ss>> source;
ss>> dest;
ss>>request;
ss>> srcType;
ss>> destType;
ss>> packetSize;
ss>> dependency;
while (ss >> listdep) dep.push_back(listdep);
// Create my packet

}
myfile.close();
}
else cout << "Unable to open file";

使用上面的代码,我可以从一行中获取我需要的所有信息。问题是我需要在一个类中使用这段代码,当我调用它时它只返回一行信息。当我调用这个类时,有没有办法指向特定的行?

最佳答案

您的应用程序似乎需要单次顺序传递输入,因此处理 1GB 或 100GB 的文件可能只是耐心和并行性的问题。

方法应该是逐行翻译记录。您应该避免尝试将整个文件读入内存的策略。 STL 提供易于使用的 std::ifstream 类和内置的 getline 方法,该方法返回包含要转换的行的 std::string。

如果您感觉更有野心并且想要更仔细地控制读取或缓冲的数据量,那么您不会是第一个使用自己的代码来实现缓冲读取器的开发人员。这是一个相当强大的练习,将帮助您通过阅读部分行等来思考一些极端情况。但最终,它可能不会对您的目标产生重大插入作用。我怀疑 ifstream 方法会让您轻松启动并运行,并且最终不会成为处理这些文件的瓶颈。

如果您真的关心优化执行时间,那么拥有多个文件可能有助于您启动并行处理任务。

// define a class to hold your custom record
class Record {
};

// create a parser function to convert a line of text into the record
bool parse(std::string const &line, Record &record) {
}

// create a translator method to convert a record into the desired output
bool write(Record const &record, std::ofstream &os) {
}

// actually open input stream for the input file
std::ifstream is;
std::ofstream os;
std::string line;

while (std::getline(is,line)) {
Record record;
if (!parse(line,record)) break;
if (!write(record,os)) break;
}

您可以通过将 Record 实例移到 while 循环之外来重新使用它,只要您小心地重置变量,以便来自先前记录的信息不会污染当前记录。您还可以通过生成流输入和输出运算符 ("<<",">>") 来一头扎进 C++ 生态系统,但我个人认为这种方法比它的值(value)更容易混淆。

关于c++ - 用 C++ 解析巨大的 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com