次のような .csv ファイルがあるとします。
1,2,5,5,
0,5,6,9,
3,2,5,7,
1,2,3,6,
各行末の「,」記号を削除するにはどうすればよいですか?
ps
たとえば、行末のスペースfile.readLine().trimmed();
をきれいにする方法は知っていますが、他の記号についても同じことを行う方法はわかりません。
行ごとに読む方法をすでに知っていると仮定すると、この大まかな方法は機能します。
QString testStr = QString("1,2,5,5,");
QStringList testList = testStr.split(",");
qDebug() << "testList" << testList;
testList.removeLast();
qDebug() << "testList" << testList;
testStr = testList.join(",");
qDebug() << "testStr" << testStr;
// 出力
testList ("1", "2", "5", "5", "")
testList ("1", "2", "5", "5")
testStr "1,2,5,5"
これは私のために働く:
#include <QCoreApplication>
#include <QFile>
#include <QIODevice>
#include <QTextStream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile inFile("input.csv");
if(!inFile.open(QIODevice::ReadOnly))
exit(1);
QString newFileData;
QTextStream in(&inFile);
//Read file line by line until it reaches the end
while(!in.atEnd())
{
QString line = in.readLine();
newFileData.append(line);
int positionOfLastChar = newFileData.length()-1;
char lastChar = newFileData.at(positionOfLastChar).toLatin1(); //Returns the character bevore the last character
if(lastChar == ',')
newFileData.remove(positionOfLastChar, //Remove at the position of the previous character
1 //one character
);
newFileData.append('\n'); //Append the newline again, because in.readLine() ignored it
}
inFile.close();
QFile outFile("output.csv");
if(!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
exit(1);
//Write the data to the output file
QTextStream out(&outFile);
out << newFileData;
outFile.close();
return a.exec();
}
これが役立つことを願っています。
これは、ファイル全体をメモリに保存しない別の方法です。また、コンソール アプリケーションがエラーを処理する方法も示します。
#include <QCoreApplication>
#include <QStringList>
#include <QFile>
#include <QTextStream>
#include <cstdio>
QTextStream err(stderr);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
if (a.arguments().length() != 3) {
err << "Usage: " << a.arguments()[0] << " infile outfile" << endl;
return 1;
}
QFile fin(a.arguments()[1]), fout(a.arguments()[2]);
if (! fin.open(QIODevice::ReadOnly)) {
err << "Can't open input file: " << fin.fileName() << endl;
return 2;
}
if (! fout.open(QIODevice::WriteOnly)) {
err << "Can't open output file: " << fout.fileName() << endl;
return 3;
}
QTextStream in(&fin), out(&fout);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (line.endsWith(",")) line.truncate(line.length()-1);
out << line << "\n";
if (in.status() != QTextStream::Ok) {
err << "Error while reading." << endl;
return 4;
}
if (out.status() != QTextStream::Ok) {
err << "Error while writing." << endl;
return 5;
}
}
return 0;
}
また、別の方法で作ることもできます。このテキストline by line
とを読むことができますpush.back() to vector
。そして、ループ内ですべてのベクトルを呼び出すことができ、last items of vectors
. そして、必要に応じて、ベクターを txt ファイルに書き込むことができます。その後、「、」は削除されます。