在 C++ 中获取文本 CSV 文件中的字符串

2024-02-19

我有一个这样的大型 CSV (~75 MB):

1,3,4.1,5.4
-2,-4,-0.1,-11.3
...

我用这段代码存储我的数据(C风格):

#include <iostream>
#include <cstdio>
#include <vector>

int main()
{
    int s;
    int x;
    float y;
    double z;

    std::vector<int> t;
    std::vector<int> u;
    std::vector<float> v;
    std::vector<double> w;

    if (std::FILE *f = std::fopen("data.csv", "r")) {
        while (std::fscanf(f, "%d,%d,%f,%lf", &s, &x, &y, &z) == 4) {
            t.push_back(s);
            u.push_back(x);
            v.push_back(y);
            w.push_back(z);
        }
    std::fclose(f);
    }

    return 0;
}

我花了这么大的 CSV 文件(~75MB):

real        0m3.195s
user        0m3.032s
sys         0m0.148s

C 风格的速度太快了!

这段代码的另一种方式(C++风格):

#include <iostream>
#include <fstream>
#include <vector>

int main()
{
    char c; // to eat the commas. Not eat spaces :-(
    int s;
    int x;
    float y;
    double z;

    std::vector<int> t;
    std::vector<int> u;
    std::vector<float> v;
    std::vector<double> w;

    std::ifstream file("data.csv");
    while (file >> s >> c >> x >> c >> y >> c >> z) {
        t.push_back(s);
        u.push_back(x);
        v.push_back(y);
        w.push_back(z);
    }

    return 0;
}

我花了这么大的 CSV 文件(~75MB):

real        0m4.766s
user        0m4.660s
sys         0m0.088s

C风格更快!

我想读取第一列(或第二列)中的字符串并放入一个向量std::string.

我尝试了很多可能性(char *、iostream 等),但我无法以快速而优雅的方式完成。

大型 CSV 文件类型的示例(是否有一种比另一种更容易阅读?):

a.csv:

hi,3,4.1,5.4
hello,-4,-0.1,-11.3
...

b.csv:

hi 3 4.1 5.4
hello -4 -0.1 -11.3
...

c.csv:

"hi",3,4.1,5.4
"hello",-4,-0.1,-11.3
...

d.csv:

"hi" 3 4.1 5.4
"hello" -4 -0.1 -11.3
...

非常感谢你的帮助! :)


那么您正在寻找一种更有效的方法来做到这一点?好吧,你可以做的一件事就是考虑你是否真的需要向量。根据您的使用情况,您可能更适合使用某种链表结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中获取文本 CSV 文件中的字符串 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • AWK:递归下降 CSV 解析器

    响应一个BASH 中的递归下降 CSV 解析器 https codereview stackexchange com questions 11727 need some advice or help with translation and
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐