0

12 列の .csv ファイルがあり、CSVReader クラスでファイルを読み取ります。

List<String[]> rows = reader.readAll();

しかし、一部の String[] の要素が 12 未満であることがわかりました。デバッグしたところ、これは CSV テキスト形式の問題であることがわかりました。

2 つの問題があります。

  1. 一部の列はバックスラッシュで終わります。

    たとえば、エスケープ文字と見なされるように、"Column A content\", "Column B content"1 つの列として読み取られます。\"

  2. 一部のセルの内容が含ま\"れています。

    たとえば、ある行では、列 A の内容はコマンド ラインです。 "d -R u+rwX \""${MYTMP}\"" > /dev/null 2>&1; rm -fr \""${MYTMP}\"" >"

したがって、このフォーマットの問題に対処するための適切な代替戦略は思いつきません。\(たとえば、すべてをに置き換えます\\。これは状況では機能しますが、セルのコンテンツの場合は"contentA\","contentB"機能しません)\"

助言がありますか?また、リーダーが正しく読み取れないように、CSV ファイルで経験した不適切な書式設定の問題と解決策について話し合うことも歓迎します。

4

2 に答える 2

1

これに置き換えれば問題は解決すると\",思います。ほとんどの場合、Unix コマンド ラインには .の直後に文字\\",が含まれていません。空白を追加するか、空白を追加して拡張する必要がある場合があります。,\"\", "\\", "

特殊なケースは、最後の列が終了するときであるため、行区切り文字 ( 、または)の場所\"<nl>に置き換える必要があります。\\"<nl><nl>\r\n\r\n

于 2013-07-17T21:00:12.100 に答える
0

次のような 1 行がある場合:

"Column A content\","Column B content","d -R u+rwX \""${MYTMP}\"" > /dev/null 2>&1; rm -fr \""${MYTMP}\"" >"

次を試してください。

CSVParser parser = new CSVParser();
String line = "\"Column A content\\\",\"Column B content\",\"d -R u+rwX \\\"\"${MYTMP}\\\"\" > /dev/null 2>&1; rm -fr \\\"\"${MYTMP}\\\"\" >\"";
line = line.replaceAll("\\\\\"(?=,)", "\\\\\\\\\"");
line = line.replaceAll("\\\\\"\"", "\\\\\"");
String[] array = parser.parseLine(line);
for (String str : array) {
    System.out.println(str);
}

出力:

Column A content\
Column B content
d -R u+rwX "${MYTMP}" > /dev/null 2>&1; rm -fr "${MYTMP}" >
于 2013-07-17T21:26:24.440 に答える