「Qtの基礎 - CSVファイル」の版間の差分
		
		
		
		
		
		ナビゲーションに移動
		検索に移動
		
				
		
		
	
|  (→概要) | |||
| 1行目: | 1行目: | ||
| == 概要 == | == 概要 == | ||
| CSV (Comma-Separated Values) ファイルは、テキストベースのデータ形式である。<br> | |||
| 各行がデータレコードを表しており、フィールドはカンマで区切られている。<br> | |||
| <br> | |||
| Qtでは、CSVファイルの読み書きを簡単に行うことができる。<br> | |||
| <br> | |||
| 主に<code>QFile</code>クラス、<code>QTextStream</code>クラス、<code>QStringList</code>を使用してCSVファイルを操作する。<br> | |||
| <code>QFile</code>クラスはファイルのオープン・クローズを行い、<code>QTextStream</code>クラスはテキストの読み書きを行う。<br> | |||
| <code>QStringList</code>クラスは、CSVの各行を分割して扱う場合に便利である。<br> | |||
| <br> | |||
| ファイルの読み込み時は、<code>QFile</code>オブジェクトでファイルを開き、<code>QTextStream</code>オブジェクトを使用して1行ずつ読み込む。<br> | |||
| 各レコードは、<code>QString::split</code>メソッドでフィールドに分割することができる。<br> | |||
| <br> | |||
| 書き込み時も同様、<code>QFile</code>オブジェクトと<code>QTextStream</code>オブジェクトを使用する。<br> | |||
| データをカンマで連結して、<code>QTextStream</code>クラスの<code><<</code>演算子を使用して書き込む。<br> | |||
| <br> | |||
| また、ファイルがオープンできない、書き込むことができない等の状況に対応するため、適切な例外処理やエラー処理を実装することが推奨される。<br> | |||
| <br> | |||
| なお、CSVファイルの形式が統一されていない場合 (例: フィールド内にカンマが含まれる)、パースが複雑になることがある。<br> | |||
| このような場合は、正規表現やより高度なパーシング技術が必要になることもある。<br> | |||
| <br><br> | <br><br> | ||
2024年9月7日 (土) 13:30時点における版
概要
CSV (Comma-Separated Values) ファイルは、テキストベースのデータ形式である。
各行がデータレコードを表しており、フィールドはカンマで区切られている。
Qtでは、CSVファイルの読み書きを簡単に行うことができる。
主にQFileクラス、QTextStreamクラス、QStringListを使用してCSVファイルを操作する。
QFileクラスはファイルのオープン・クローズを行い、QTextStreamクラスはテキストの読み書きを行う。
QStringListクラスは、CSVの各行を分割して扱う場合に便利である。
ファイルの読み込み時は、QFileオブジェクトでファイルを開き、QTextStreamオブジェクトを使用して1行ずつ読み込む。
各レコードは、QString::splitメソッドでフィールドに分割することができる。
書き込み時も同様、QFileオブジェクトとQTextStreamオブジェクトを使用する。
データをカンマで連結して、QTextStreamクラスの<<演算子を使用して書き込む。
また、ファイルがオープンできない、書き込むことができない等の状況に対応するため、適切な例外処理やエラー処理を実装することが推奨される。
なお、CSVファイルの形式が統一されていない場合 (例: フィールド内にカンマが含まれる)、パースが複雑になることがある。
このような場合は、正規表現やより高度なパーシング技術が必要になることもある。
CSVファイル
以下の例では、CSVファイルを作成している。
処理の流れを以下に示す。
- 数値データを生成する。
 ここでは、sin曲線である を生成する。
- 数値データをテキストデータに変換する。
- ファイル保存ダイアログを開いて、保存するファイル名を入力する。
- 全テキストデータを書き込む。
 #include <QFileDialog>
 #include <QMessageBox>
 #include <QTextStream>
 #include <QFile>
 #include <vector>
 #include <math.h>
 #include <sstream>
 #include "mainwindow.h"
 #include "ui_mainwindow.h"
 
 using namespace std;
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }
 
 void MainWindow::OnButtonClicked()
 {
    // Input File Name
    QString FileName = QFileDialog::getSaveFileName(this, tr("Save CSV File"), "", tr("CSV (*.csv);;All Files (*)"));
 
    if(FileName.isEmpty())
    {  // Cancel
       return;
    }
 
    // Generate CSV Data
    int iSize = 100;
    vector<double> lx(iSize, 0.0f),
                   ly(iSize, 0.0f);
 
    double dx = 2 * 3.15159 / iSize;
    for(int i = 0; i < iSize; i++)
    {
       lx[i] = i * dx;
       ly[i] = sin(vx);
    }
 
    // Convert from Double to String
    QString strFileData = "";
    //stringstream ss;
    for(int i = 0; i < iSize; i++)
    {
        strFileData += lx[i] + ", " + ly[i] + "\n";
        //ss << lx[i] << "," << ly[i] << endl;
    }
    
    // Write to File
    QFile File(FileName);
    if(!File.open(QIODevice::WriteOnly))
    { 
        QMessageBox::information(this, tr("Unable to open file"), File.errorString());
 
        return;
    }
 
    QTextStream OutStream(&File);
    // 浮動小数点をe形式にする
    //OutStream.setRealNumberNotation(QTextStream::ScientificNotation);
 
    // 浮動小数点の桁数を固定
    //OutStream.setRealNumberNotation(QTextStream::FixedNotation);
 
    // 浮動小数点の桁数を設定
    OutStream.setRealNumberPrecision(3);
 
    OutStream << strFileData;
    //OutStream << ss.str().c_str();
 
    File.close();
 }