1

JSON配列をC++でCSVファイルに変換しようとしていますが、メソッドがどうあるべきか知りたいです。

次のようなJSON配列があるとします。

[["Bcode","firstname","lastname"],
["11234","richard","nixon"]]

そして、それを.csvに変換したいのですが、(私が理解しているように)

Bcode,firstname,lastname,
11234,richard,nixon

取得しているJSON配列にはすでに改行が含まれているようですが、すべての引用符と角かっこを削除して、実行可能なCSVファイルにすることはできますか?

または、MSExcelで読み取ることができるJSON配列を保存できるファイル拡張子はありますか?

ありがとう

4

2 に答える 2

1

引用符を削除する理由はありません。CSVには引用符を含めることができます(頻繁に含めることができます)。フィールド内にコンマを含める場合はいつでも必要です(たとえば、個別のフィールドの代わりに「名前」フィールドがあるfirstname場合lastname、値は「Nixon、Richard」になります。引用符を削除すると、単一のフィールドのようには見えなくなります。

行末のコンマを削除したい。

引用符が埋め込まれているフィールドも検討します。メモリが機能する場合、JSONは\"フィールド内の引用符を通知するために使用します。CSVはを使用する""ため、データに引用符が埋め込まれていない/含まれていない場合を除き、置換も処理する必要があり\"ます""

于 2012-07-18T16:36:49.520 に答える
0

正式には、JSON文字列には「\ n」、「\u20AC」などのエスケープ文字を含めることができます。

これらすべてのケースを処理するには、JSONテキストを解析するためのJSONパーサーが必要になります。

アプリケーションでは、SAXスタイル(イベントベース)のAPIを使用できます。つまり、中間DOM(ドキュメントオブジェクトモデル)を生成せずに、JSONファイルを最初から最後までスキャンします。

SAXスタイルのAPIをサポートするrapidjsonを確認できます。

$ rapidjson :: Writer $を参照してCSVライターを作成し、イベントからCSV文字列を出力できます。コードは次のようになります。

CsvWriter writer(outputStream);
rapidjson::Reader reader;
reader.Parse<0>(inputStream, writer);

次に、リーダーは、入力ストリームの解析中にライターのメンバー関数を呼び出します。あなたの例では、次の順序で関数を呼び出します。

writer.StartArray();
writer.StartArray();
writer.String("Bcode", 5, true);
writer.String("firstname", 9, true);
writer.String("lastname", 8, true);
writer.EndArray();
writer.StartArray();
writer.String("11234", 5, true);
writer.String("richard", 7, true);
writer.String("nixon", 5, true);
writer.EndArray();
writer.EndArray();

String()の2番目のパラメーターは、文字列の長さです。3番目のパラメーターは、文字列を複製する必要があるかどうかを示します。

これらの関数呼び出しを使用して、独自のCSV形式を簡単に書き出すことができます。

最後に、SAXスタイルのAPIを使用すると、必要なメモリ消費量ははるかに少なくなりますが、ハンドラーはDOMバージョンよりも記述が難しい場合があることに注意してください。Rapidjsonは、選択したSAXスタイルとDOMスタイルのAPIの両方をサポートします。

于 2012-11-14T09:02:06.370 に答える