web-dev-qa-db-ja.com

C ++から.csvファイルを作成する

データを.csvファイルに出力しようとしていますが、ファイルに出力していますが、データが異なる列に分割されておらず、データが誤って出力されているようです。

    ofstream Morison_File ("linear_wave_loading.csv");         //Opening file to print info to
    Morison_File << "Time Force(N/m)" << endl;          //Headings for file
    for (t = 0; t <= 20; t++) {
      u = sin(omega * t);
      du = cos(omega * t); 
      F = (0.5 * rho * C_d * D * u * fabs(u)) + rho * Area * C_m * du; 

      cout << "t = " << t << "\t\tF = " << F << endl;
      Morison_File << t;                                 //Printing to file
      Morison_File << F;

    }

     Morison_File.close();

TimeとForce(N/m)はそれぞれ列AとBにありますが、tとFの値は両方とも最初の行を印刷しています。

Tを列Aに、Fを列Bに出力するためにそれらを分離する構文は何ですか?

33
user3460758

CSVファイルについて特別なことはありません。 基本ルール に従うだけで、テキストエディターを使用して作成できます。 RFC 4180(tools.ietf.org/html/rfc4180)受け入れられる区切り記号は、セミコロン ';'ではなく、コンマ '、'です。 MS Excelなどのプログラムでは、区切り文字としてカンマが必要です。

コンマを小数点として、セミコロンを区切り文字として扱うプログラムがいくつかありますが、これらは技術的にはCSV形式のファイルの「受け入れられた」標準の範囲外です。

したがって、CSVを作成するときは、ファイルストリームを作成し、次のように行を追加します。

#include <iostream>
#include <fstream>
int main( int argc, char* argv[] )
{
      std::ofstream myfile;
      myfile.open ("example.csv");
      myfile << "This is the first cell in the first column.\n";
      myfile << "a,b,c,\n";
      myfile << "c,s,v,\n";
      myfile << "1,2,3.456\n";
      myfile << "semi;colon";
      myfile.close();
      return 0;
}

これにより、MS Excelで開くと、次のようなCSVファイルが作成されます。

Image of CSV file created with C++

66
BHawk

変化する

Morison_File << t;                                 //Printing to file
Morison_File << F;

Morison_File << t << ";" << F << endl;                                 //Printing to file

aは、代わりに

8
Mr.WorshipMe

ここにクラスのようなSTLがあります

ファイル「csvfile.h」

#pragma once

#include <iostream>
#include <fstream>

class csvfile;

inline static csvfile& endrow(csvfile& file);
inline static csvfile& flush(csvfile& file);

class csvfile
{
    std::ofstream fs_;
    const std::string separator_;
public:
    csvfile(const std::string filename, const std::string separator = ";")
        : fs_()
        , separator_(separator)
    {
        fs_.exceptions(std::ios::failbit | std::ios::badbit);
        fs_.open(filename);
    }

    ~csvfile()
    {
        flush();
        fs_.close();
    }

    void flush()
    {
        fs_.flush();
    }

    void endrow()
    {
        fs_ << std::endl;
    }

    csvfile& operator << ( csvfile& (* val)(csvfile&))
    {
        return val(*this);
    }

    csvfile& operator << (const char * val)
    {
        fs_ << '"' << val << '"' << separator_;
        return *this;
    }

    csvfile& operator << (const std::string & val)
    {
        fs_ << '"' << val << '"' << separator_;
        return *this;
    }

    template<typename T>
    csvfile& operator << (const T& val)
    {
        fs_ << val << separator_;
        return *this;
    }
};


inline static csvfile& endrow(csvfile& file)
{
    file.endrow();
    return file;
}

inline static csvfile& flush(csvfile& file)
{
    file.flush();
    return file;
}

ファイル「main.cpp」

#include "csvfile.h"

int main()
{
    try
    {
        csvfile csv("MyTable.csv"); // throws exceptions!
        // Hearer
        csv << "X" << "VALUE"        << endrow;
        // Data
        csv <<  1  << "String value" << endrow;
        csv <<  2  << 123            << endrow;
        csv <<  3  << 1.f            << endrow;
        csv <<  4  << 1.2            << endrow;
    }
    catch (const std::exception& ex)
    {
        std::cout << "Exception was thrown: " << e.what() << std::endl;
    }
    return 0;
}

最新バージョン こちら

絶対です ";"区切り文字、CSV =>コンマ区切り値

 ofstream Morison_File ("linear_wave_loading.csv");         //Opening file to print info to
    Morison_File << "'Time'; 'Force(N/m)' " << endl;          //Headings for file
    for (t = 0; t <= 20; t++) {
      u = sin(omega * t);
      du = cos(omega * t); 
      F = (0.5 * rho * C_d * D * u * fabs(u)) + rho * Area * C_m * du; 

      cout << "t = " << t << "\t\tF = " << F << endl;
      Morison_File << t << ";" << F;

    }

     Morison_File.close();
2
MiguelAngel_LV

C++で.csvファイルを作成する場合は、次の構文を使用する必要があります。

myfile <<" %s; %s; %d", string1, string2, double1 <<endl;

これにより、3つの変数(文字列1&2およびdouble1)が別々の列に書き込まれ、それらの下に空の行が残ります。 Excelで;は新しい行を意味するため、新しい行を取得したい場合は、単純な「;」を書くことができます。新しいデータをファイルに書き込む前に。下に空の行を入れたくない場合は、endlを削除して次を使用する必要があります。

myfile.open("result.csv", std::ios::out | std::ios::app);

.csvファイルを開くときの構文(result.csvの例)。このようにして、次回にresult.csvファイルに何かを書き込む(最後の行のすぐ下の新しい行に書き込む)ので、必要に応じてforサイクルを簡単に管理できます。

1
Ádám Hadar