web-dev-qa-db-fra.com

Écrire des fichiers .csv à partir de C ++

J'essaie de générer des données dans un fichier .csv. Le fichier est exporté dans le fichier, mais il ne sépare pas les données dans des colonnes différentes et semble ne pas générer correctement les données.

    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();

Le temps et la force (N/m) sont dans les colonnes A et B respectivement, mais les valeurs t et F impriment toutes les deux la première ligne.

Quelle est la syntaxe pour les séparer pour imprimer t dans les colonnes A et F dans la colonne B?

33
user3460758

Un fichier CSV n'a rien de spécial. Vous pouvez les créer en utilisant un éditeur de texte en suivant simplement le règles de base . Le séparateur accepté par la RFC 4180 (tools.ietf.org/html/rfc4180) est la virgule ',' pas 'le point-virgule'; '. Des programmes tels que MS Excel attendent une virgule comme séparateur.

Certains programmes traitent la virgule comme une décimale et le point-virgule comme un séparateur, mais ils sont techniquement en dehors de la norme "acceptée" pour les fichiers au format CSV.

Ainsi, lors de la création d'un fichier CSV, créez votre filestream et ajoutez vos lignes comme suit:

#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;
}

Cela se traduira par un fichier CSV qui ressemble à ceci à l'ouverture de MS Excel:

Image of CSV file created with C++

66
BHawk

Changement

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

À

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

a, ferait aussi à la place de;

8
Mr.WorshipMe

Voici un STL comme classe

Fichier "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;
}

Fichier "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;
}

Dernière version ici

6

Vous devez ";" séparateur, CSV => valeur du séparateur de virgule

 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

Si vous utilisez un fichier .csv en C++, vous devez utiliser la syntaxe suivante:

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

Cela écrira les trois variables (chaînes 1 et 2 et double1) dans des colonnes séparées et laissera une ligne vide en dessous. Dans Excel le; signifie la nouvelle ligne, donc si vous voulez juste prendre une nouvelle ligne, vous pouvez aussi écrire un simple ";" avant d'écrire vos nouvelles données dans le fichier. Si vous ne voulez pas avoir une ligne vide ci-dessous - vous devez supprimer le endl et utiliser le:

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

syntaxe lors de l’ouverture du fichier .csv (exemple, result.csv). Ainsi, la prochaine fois que vous écrivez quelque chose dans votre fichier result.csv - il l'écrira dans une nouvelle ligne située directement sous la dernière - de sorte que vous puissiez facilement gérer un cycle for si vous le souhaitez.

1
Ádám Hadar