📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

108行目: 108行目:
   
   
     File.close();
     File.close();
}
</syntaxhighlight>
<br><br>
== CSVファイル (RFC4180準拠) の読み込み ==
RFC4180は、CSVファイルの標準的な形式を定義しており、これに従うことで互換性の高いCSV処理が可能になる。<br>
<br>
以下の例では、RFC4180の規則に従ってCSVファイルを読み込んでいる。<br>
* ダブルクォートで囲まれたフィールド内のカンマと改行を正しく処理する。
* フィールド内の二重引用符 ("") を単一の引用符 ('') として解釈する。
* 各行の末尾の空白を除去する。
<br>
<syntaxhighlight lang="c++">
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QDebug>
QList<QStringList> readCSV(const QString &filename)
{
    QList<QStringList> result;
    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
      qDebug() << "ファイルを開けません:" << filename;
      return result;
    }
    QTextStream in(&file);
    in.setCodec("UTF-8");
    QString    line;
    QStringList fields;
    bool inQuotes = false;
    QString field;
    while (!in.atEnd()) {
      QChar ch;
      in >> ch;
      if (inQuotes) {
          if (ch == '"') {
            if (in.peek() == '"') {
                field += ch;
                in >> ch;  // 次の文字(二重引用符)を読み飛ばす
            }
            else {
                inQuotes = false;
            }
          }
          else {
            field += ch;
          }
      }
      else {
          if (ch == '"') {
            inQuotes = true;
          }
          else if (ch == ',' || ch == '\n' || in.atEnd()) {
            fields.append(field.trimmed());
            field.clear();
            if (ch == '\n' || in.atEnd()) {
                result.append(fields);
                fields.clear();
            }
          }
          else {
            field += ch;
          }
      }
    }
    file.close();
    return result;
}
</syntaxhighlight>
<br><br>
== CSVファイル (RFC4180準拠) の書き込み ==
RFC4180は、CSVファイルの標準的な形式を定義しており、これに従うことで互換性の高いCSV処理が可能になる。<br>
<br>
以下の例では、RFC4180の規則に従ってCSVファイルを書き込んでいる。<br>
* カンマ、引用符、改行を含むフィールドを適切にダブルクォートで囲む。
* フィールド内の引用符を二重引用符 ("") にエスケープする。
* 各行の終わりに改行を挿入する。
<br>
<syntaxhighlight lang="c++">
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QDebug>
bool writeCSV(const QString &filename, const QList<QStringList> &data)
{
    QFile file(filename);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
      qDebug() << "ファイルを開けません:" << filename;
      return false;
    }
    QTextStream out(&file);
    out.setCodec("UTF-8");
    for (const QStringList &row : data) {
      for (int i = 0; i < row.size(); ++i) {
          QString field = row[i];
          bool needQuotes = field.contains(QRegExp("[,\"\n\r]"));
          if (needQuotes) {
            out << '"' << field.replace("\"", "\"\"") << '"';
          }
          else {
            out << field;
          }
          if (i < row.size() - 1) {
            out << ",";
          }
      }
      out << "\n";
    }
    file.close();
    return true;
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>