私は、検索結果をCSVファイルにエクスポートしてExcelで開く機能を作っています。 フィールドの1つはフリーテキストフィールドで、改行、カンマ、引用などが含まれる場合があります。 これに対処するため、フィールドを二重引用符(")で囲んでいます。
しかし、Excel 2007にデータを取り込み、適切な区切り文字を設定し、テキスト修飾子をダブルクォートに設定しても、テキストフィールド全体が1つのセルに表示されると思われる改行位置で新しいレコードが作成されてしまいます。
CR/LF (\r) を CR (\r) だけ、LF (\n) だけにしてみたのですが、うまくいきません。
このような現象に遭遇した方はいらっしゃいますか?また、どのように解決しましたか?
TIA,
-J
EDIT:
以下は、この問題を再現するために手書きで書いた簡単なファイルです。
ID,Name,Description<br>。 "12345","Smith, Joe","Hey.
My name is Joe."
Excel 2007にインポートすると、ヘッダー行と2つのレコードが作成されます。 Smith, Joe"のカンマは正しく処理されていることに注意してください。 問題があるのは改行だけです。
Excel(少なくともXPのOffice 2007では)は、CSVファイルをFile-> Openメニューから開くか、Explorerでファイルをダブルクリックしてインポートするかに応じて、動作が異なります。
UTF-8エンコーディングのCSVファイルがあり、一部のセルに改行が含まれています。 Excelの[ファイル]> [開く]メニューからこのファイルを開くと、「CSVをインポート」ウィザードがポップアップし、ファイルを正しくインポートできません。引用されている場合でも、改行によって新しい行が開始されます。 Explorerウィンドウでダブルクリックしてこのファイルを開くと、ウィザードの介入なしに正しく開きます。
これを手動で行う場合。, LibreOfficeをダウンロードし、LibreOffice Calcを使用してCSVをインポートします。 Excel I'のどのバージョンよりも、このような作業にはるかに優れています。;試しました。, その後Excelに転送する必要がある場合は、必要に応じてXLSまたはXLSXに保存できます。
しかし、Excelに行き詰まり、より良い修正が必要な場合は、方法があるようです。 それはロケールに依存しているようです(私の控えめな意見では、ばかげているようです)。 Excel 2007はありませんが、Excel 2010があり、例は次のとおりです。
ID,Name,Description
"12345","Smith, Joe","Hey.
My name is Joe."
機能しません。 Notepadで書いて、Save asを選択しました。..、[保存]ボタンの横にあるエンコーディングを選択できます。 私は提案どおりにUTF-8を選択しましたが、運がありませんでした。 しかし、コンマをセミコロンに変更することは私にとってはうまくいきました。 私は他に何も変更しませんでした、そしてそれはうまくいきました。 そこで、この例を変更して、メモ帳に保存するときにUTF-8エンコーディングを選択しました。
ID;Name;Description
"12345";"Smith, Joe";"Hey.
My name is Joe."
しかし、問題があります。! 機能する唯一の方法は、CSVファイルをダブルクリックしてExcelで開くことです。 テキストからデータをインポートしてこのCSVを選択した場合でも、引用された改行では失敗します。
しかし、別のキャッチがあります。! 作業フィールドセパレーター(元の例ではコンマ、私の場合はセミコロン)は、システムの地域設定(コントロールパネル->地域と言語に設定)に依存しているようです。 ノルウェーでは、カンマは小数点記号です。 Excelはこのキャラクターを避け、代わりにセミコロンを好むようです。 私は別のコンピューターセットをUK Englishロケールにアクセスでき、そのコンピューターでは、コンマセパレーターの最初の例は正常に機能し(ダブルクリックでのみ)、セミコロン付きのものは実際には失敗します。! 相互運用性についてはこれで終わりです。 このCSVをオンラインで公開し、ユーザーがExcelを使用している場合は、両方のバージョンを公開し、正しい数の行が表示されているファイルをユーザーに確認することをお勧めします。
これを機能させるために私が集めることができたすべての詳細は次のとおりです。
1。 ファイルはBOMを使用してUTF-8として保存する必要があります。これは、UTF-8を選択したときにメモ帳が行うことです。 BOMなしでUTF-8を試しましたが(Notepad ++で簡単に切り替えることができます)、ドキュメントをダブルクリックすると失敗します。 2。 地域設定で10進区切り文字であるコンマまたはセミコロン区切り文字を使用する必要がありますが、カンマまたはセミコロン区切り文字を使用する必要はありません。 おそらく他のキャラクターは機能しますが、どちらなのかわかりません。 3。 「文字」の改行を含むフィールドを引用する必要があります。 4。 テキストフィールドとレコードセパレーターの両方でWindowsの行末(\ r \ n)を使用しました。 5。 ファイルをダブルクリックして開く必要があります。テキストからデータをインポートしても機能しません。
これが誰かを助けることを願っています。
短い答え。
-。
newline / linefeed文字(Notepad ++では \ n
)を削除します。 Excelは、キャリッジリターン文字( \ r
)を認識して、レコードを分離します。
長い答え。 ---。
前述のように、改行文字はCSVフィールド内でサポートされていますが、Excelは常に優雅に処理するわけではありません。 エンコーディングの問題が発生している可能性があるが、エンコーディングの変更では改善されなかったサードパーティのCSVでも同様の問題に直面しました。
私にとってうまくいったのは、すべての改行文字( \ n
)を削除することでした。 これは、レコードがキャリッジリターンと改行(CR / LF)の組み合わせで区切られていると仮定すると、フィールドを単一のレコードに折りたたむ効果があります。 その後、Excelはファイルを適切にインポートし、キャリッジリターンによって新しいレコードを認識します。
明らかに、よりクリーンな解決策は、最初に実際の改行( \ r \ n
)を一時的な文字の組み合わせに置き換え、改行( \ n
)を選択した分離文字(例:. semicolonファイルのコンマ)、次に一時文字を適切な改行で再度置き換えます。
Jアシュリーのコメントで+1。 私もこの問題に遭遇しました。 Excelには次のものが必要であることがわかります。
-引用された文字列の改行文字( "\ n")。
-各行間のキャリッジリターンと改行。
例.。 「テスト」、「マルチラインアイテム\ n。 マルチラインアイテム "\ r \ n。 「テスト2」、「マルチラインアイテム\ n。 マルチラインアイテム "\ r \ n。
メモ帳++を使用して、各行を適切に区切って、文字列内の改行のみを使用しました。 これを発見するには、空白のExcel docにマルチラインエントリを作成し、メモ帳++でcsvを開きます。
誰かがこのスレッドに出くわして決定的な答えを探しているなら、ここに行きます(LibreOfficeについて言及している人への信用:
1)LibreOfficeをインストールします。 2)Calcを開き、ファイルをインポートします。 3)私のtxtファイルには、で区切られたフィールドと、 "で囲まれた文字フィールドがありました。 4)ODSファイルとして保存します。 5)ExcelでODSファイルを開きます。 6).xls(x)として保存します。 7)完了しました。 8)これは私にとって完全に機能し、BIGTIMEを救いました。!
WinXPでのExcel 2010でのフランスの地域設定での経験。
-インポートされたcsvのセパレーターは、地域設定のリストセパレーターに対応している必要があります(私の場合)。 -エクスプローラーからファイルをダブルクリックする必要があります。 Excelから開けないでください。
私も同様の問題を抱えていました。 MySQLにTwitterデータがありました。データには、データにLine feed(LFまたは\ n)が含まれていました。 MySQLデータをExcelにエクスポートする必要がありました。 LFは私のcsvファイルのインポートを台無しにしていました。 だから私は次のことをしました-。
1. From MySQL exported to CSV with Record separator as CRLF
2. Opened the data in notepad++
3. Replaced CRLF (\r\n) with some string I am not expecting in the Data. I used ###~###! as replacement of CRLF
4. Replaced LF (\n) with Space
5. Replaced ###~###! with \r\n, so my record separator are back.
6. Saved and then imported into Excel
注-CRLFまたはLFを交換するときは、Excended(\ n、\ r、\ t。.. チェックボックス[ダイアログボックスの左下を見てください)。
元の投稿からほぼ10年後、ExcelはCSVファイルのインポートを改善していません。 ただし、HTMLテーブルのインポートの方がはるかに優れていることがわかりました。 したがって、Pythonを使用してCSVをHTMLに変換し、結果のHTMLをExcelにインポートできます。
このアプローチの利点は次のとおりです。(a)確実に動作する、(b)データをサードパーティのサービスに送信する必要がない(例:. Googleシート)、(c)追加の「脂肪」インストールは必要ありません(LibreOffice、数値など)。)ほとんどのユーザーの場合、(d)CR / LF文字とBOMマーカーをいじるよりも高いレベル、(e)ロケール設定をいじる必要はありません。
Python 3がインストールされている限り、次の手順はbashのようなシェルで実行できます。 PythonはCSVを直接読み取るために使用できますが、[csvkit] [csvkit]はJSONへの中間変換を行うために使用されます。これにより、PythonコードでCSVの複雑さを処理する必要がないようにすることができます。
まず、次のスクリプトを json2html.py
として保存します。 スクリプトはstdinからJSONファイルを読み取り、HTMLテーブルとしてダンプします。
#。!/ usr / bin / env python3。
sys、json、htmlをインポートします。
__name__ == '__main__'の場合:
header_emitted = False。
make_th =ラムダs: "< th>%s< / th>" %(html.escape(s if s else ""))。
make_td =ラムダs: "< td>%s< / td>" %(html.escape(s if s else ""))。
make_tr = lambda l、make_cell: "< tr>%s< / tr>" %( "" .join([make_cell(v)for v in l]))。
print( "< html>< body> \ n< table>")。
json.load(sys.stdin)の行の場合:
lk、lv = zip(* line.items())。
ない場合はheader_emitted:
print(make_tr(lk、make_th))。
header_emitted = True。
print(make_tr(lv、make_td))。
print( "< / table \ n< / body>< / html>")。
``。
次に、仮想環境にcsvkitをインストールし、 `csvjson`を使用して入力ファイルをスクリプトにフィードします。 `-I`引数でセルタイプの推測を無効にすることをお勧めします。
```シェル。
$ virtualenv -p python3 pyenv。
$。 . ./ pyenv / bin / activate。
$ pipインストールcsvkit。
$ csvjson -I input.csv | python3 json2html.py>出力.html。
``。
これで、「output.html」をExcelにインポートできます。 細胞の改行は保存されます。
オプションで、Python仮想環境をクリーンアップすることをお勧めします。
```シェル。
$非アクティブ化。
$ rm -rf pyenv。
``。
[csvkit]:https://csvkit.readthedocs.io/en/latest/。