📢 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> | ||