【问题标题】:How to redirect printf stream output to a .csv file?如何将 printf 流输出重定向到 .csv 文件?
【发布时间】:2018-03-25 14:52:40
【问题描述】:

来自传感器,有一个看起来像元组序列的数据流:

sensor: (-0.560303, -0.627686, 0.467468)  
sensor: (-0.561829, -0.626160, 0.466125)
sensor: (-0.556091, -0.623352, 0.471497)
sensor: (-0.558411, -0.625977, 0.468811)
sensor: (-0.557312, -0.626587, 0.468262)
sensor: (-0.557800, -0.625854, 0.465820)
sensor: (-0.563599, -0.624512, 0.464722)
sensor: (-0.555847, -0.623230, 0.467163)
sensor: (-0.557861, -0.621033, 0.468811)
sensor: (-0.555420, -0.625061, 0.470520)
sensor: (-0.559082, -0.626221, 0.475891)
sensor: (-0.559814, -0.625977, 0.466309)
sensor: (-0.561768, -0.624756, 0.467163)
sensor: (-0.551941, -0.628906, 0.469055)
sensor: (-0.556946, -0.626465, 0.471313)
sensor: (-0.558533, -0.626038, 0.469421)
sensor: (-0.557922, -0.625061, 0.467285)
sensor: (-0.562622, -0.623657, 0.469971)
sensor: (-0.554443, -0.625977, 0.465759)
sensor: (-0.559265, -0.626282, 0.471619)
sensor: (-0.558716, -0.625427, 0.471375)
sensor: (-0.559143, -0.626526, 0.467468)
sensor: (-0.554749, -0.626221, 0.468079)
sensor: (-0.554626, -0.622681, 0.467285)
sensor: (-0.557983, -0.625549, 0.475464)
sensor: (-0.555603, -0.626343, 0.466980)
sensor: (-0.559570, -0.625854, 0.470398)
sensor: (-0.556946, -0.626587, 0.466858)
sensor: (-0.557373, -0.626526, 0.470093)
sensor: (-0.558716, -0.629272, 0.464905)
sensor: (-0.555725, -0.625732, 0.473877)
sensor: (-0.560608, -0.626282, 0.469238)
sensor: (-0.556335, -0.626221, 0.467590)
sensor: (-0.558777, -0.623840, 0.468994)

到目前为止,我正在将所有这些数据打印到这样的终端中:

if (sensor_data) {
            mpu.readSensorData(sensor);
            float ax = sensor[0] * 250.0 / 368.0;
            float ay = sensor[1] * 250.0 / 368.0;
            float az = sensor[2] * 250.0 / 368.0;
            pc.printf("\nsensor: (%f, %f, %f)\n", ax,ay,az);
        }*/


        wait(0.5);

如何将上述printf 输出元组重定向到单个 .csv 文件中,如下所示:

sensorX, sensorY, sensorZ
-0.560303, -0.627686, 0.467468
-0.557312, -0.626587, 0.468262
-0.557800, -0.625854, 0.465820
-0.555420, -0.625061, 0.470520
...
-0.555725, -0.625732, 0.473877

【问题讨论】:

  • 疯狂格式化有什么原因吗?
  • 是的,因为我想分析这些数据
  • 你想分析数据,所以你用一种疯狂的无意义的方式格式化它......?好的。祝你好运。
  • csv 格式的哪种荒谬方式?... @squeamishossifrage
  • 他在谈论您第一次发布的“原始”数据块(您的 '\n' 仅表示换行符......您至少应该添加 '\r' 用于回车)

标签: c++ c csv data-stream


【解决方案1】:

您可以在运行程序时在命令行中使用“>”。

例子:

./program > output.csv

您使用 printf() 函数打印的任何内容都将写入 output.csv 文件。

或者您可以使用 fprintf() 函数将所有数据写入文件。

FILE* file = fopen("output.csv", "w");
if (file != NULL)
{
        if (sensor_data) 
        {
            mpu.readSensorData(sensor);
            float ax = sensor[0] * 250.0 / 368.0;
            float ay = sensor[1] * 250.0 / 368.0;
            float az = sensor[2] * 250.0 / 368.0;
            fprintf(file, "\nsensor: (%f, %f, %f)\n", ax,ay,az);
        }
}

【讨论】:

  • 假设程序的其他地方没有作者不想重定向到文件的其他输出
  • 假设标准输出完全按照 OP 的要求格式化为 CSV。
  • 不知道为什么这段代码有pc.fprintf。它应该只是fprintf
  • @tumbleweed 我刚才说过吗?删除pc.,所以它只是fprintf
  • @tumbleweed 运行您的程序并写入文件的路径。 ./program > /Users/user/Desktop/output.csv。该文件将在桌面上创建
【解决方案2】:

你有不同的选择来做你所要求的。

选项 1(更多 C++)
使用ofstream

选项 2 (C)
你可以像 printf 一样使用fprintf 函数,给它一个用fopen() 创建的文件句柄。

选项 3(无编程)
如果您的控制台输出已经完全符合您在 CSV 文件中的要求,请使用输出重定向到文件:

C:\ yourprogram > output.csv

【讨论】:

    【解决方案3】:

    打开一个文件并使用 fprintf,将文件句柄传递给它。

    FILE *myfile = fopen ("myfilename.csv", "w" );
    

    然后在你的循环中:

    pc.printf (myfile, "\nsensor: (%f, %f, %f)\n", ax,ay,az);
    

    然后在最后:

    fclose (myfile);
    

    当然,这是 C 风格的解决方案。如果您想使用 C++ 类型的接口(您将其标记为两者),请考虑使用 iostreams。

    【讨论】:

    • 它实际上是一个数据流重要吗?..你能告诉我怎么做吗?
    • 用实际细节更新了我的答案
    【解决方案4】:

    如果你不介意关闭终端的输出,你可以使用

    frepoen("file.csv", "w", stdout);
    

    这会将您的printf 输出重定向到一个文件中。然后您可以使用 printf 写入数据。

    您还可以使用 ./your_program > file.csv 等 shell 重定向将标准输出重定向到文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2019-01-05
      • 1970-01-01
      相关资源
      最近更新 更多