26

複数行からQString::splitを取得するために使用する必要があることを理解しています。しかし、ファイルがあり、それがMac、Windows、またはUnixのいずれからのものであるかわからない場合、すべての場合にうまく機能するかどうかはわかりません。この状況に対処するための最良の方法は何ですか?QStringListQStringQString.split("\n")

4

2 に答える 2

42

空白行を削除してもよい場合は、次のことを試してください。

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);

これにより、改行文字(改行またはキャリッジリターン)が見つかるたびに文字列が分割されます。連続する改行(\r\n\r\nまたは\n\n)は、間に空の部分がある複数の区切り文字と見なされ、スキップされます。

于 2012-04-27T09:48:03.877 に答える
27

EmanueleBezziの答えはいくつかの点を見逃しています。

ほとんどの場合、テキストファイルから読み取られた文字列は、OSの行末表現を1'\n'文字に自動的に変換するテキストストリームを使用して読み取られます。したがって、ネイティブテキストファイルを扱っている場合は'\n'、心配する必要がある唯一の区切り文字にする必要があります。たとえば、プログラムがWindowsシステムで実行されている場合、テキストモードで入力を読み取ると、行末はメモリ内で1\n文字でマークされます。"\r\n"ファイルに存在するペアは表示されません。

ただし、「外部」テキストファイルを処理する必要がある場合もあります。

理想的には、そのようなファイルを読み取る前に、そのようなファイルをローカル形式に変換する必要があります。これにより、問題が回避されます。翻訳ユーティリティのみが、バリアント行末を認識する必要があります。他のすべてはテキストを扱うだけです。

しかし、それが常に可能であるとは限りません。POSIXシステム(Linux、UNIXなど)で実行しているときにプログラムでWindowsテキストファイルを処理したい場合や、その逆の場合があります。

'\r'POSIXシステム上のWindows形式のテキストファイルは、各行の終わりに余分な文字が含まれているように見えます。

Windowsシステム上のPOSIX形式のテキストファイルは、'\n'文字が埋め込まれた非常に長い1行で構成されているように見えます。

最も一般的なアプローチは、ファイルをバイナリモードで読み取り、行末を明示的に処理することです。

私はよく知らないがQString.split、これは疑わしい:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);

フォーマットに応じて、として"\n\n"またはとして表示される空の行を無視します。"\r\n\r\n"空の行は完全に有効なテキストデータです。無視するのが理にかなっていることが確実でない限り、それらを無視するべきではありません。

"\n"、、、"\r\n"またはのいずれかで区切られたテキスト入力を処理する必要がある場合は"\r"、次のようになります。

QString.split(QRegExp("\n|\r\n|\r"));

仕事をします。(正規表現の構文を手伝ってくれたparsley72のコメントに感謝します。)

'\r'もう1つのポイント:行を区切るためだけに使用されるテキストファイルに遭遇する可能性はおそらく低いでしょう。これは、バージョン9までのMacOSで使用されていた形式です。MaxOSXはUNIXに基づいており、標準のUNIXスタイルの'\n'行末を使用します(ただし、おそらく'\r'行末も許容されます)。

于 2014-02-22T22:50:14.910 に答える