- PR -

CSV出力時の改行コードについて

1
投稿者投稿内容
みきにゅう
会議室デビュー日: 2004/07/28
投稿数: 9
投稿日時: 2004-09-16 17:35
はじめまして。

SQL*PlusのSPOOL機能を使用してSELECT結果をCSVに出力するところで
悩んでいます。

一部のカラムの文字列(全角カナ:VARCHAR2)に改行が含まれている為、
検索結果をCSV出力し、エクセル等で出力したCSVを開くと、改行部分で
1レコードが複数行に分割されてしまいます。

**(例)*******************************

NO BIKO
-------------------------------
1 あああ(改行)いいい

 >SPOOL /tmp/hoge.csv
>SELECT no, biko FROM table;
>SPOOL OFF

  /tmp/hoge.csvを開くと…

1行目  1 あああ
2行目    いいい

*************************************

WRAPPEDをOFFにしてCSV出力したところ、改行される部分(「いいい」
の部分)が削除され、1行1レコードになったのですが、本来の目的は
1レコードのデータ全てを1行におさめたいです。

改行コードの有無に関わらず、CSV出力時、1レコードは1行として表示させたい
のですが、どのようにすればいいかわかりません。

SQLで改行コードを無効化できればいいのですが。。

実現方法について、アドバイス頂けませんでしょうか?


環境は以下の通りです。
 OS:RHAS2.1、Win2000pro
 DB:Oracle8i

よろしくお願い致します。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-09-16 17:50
どもです。がると申します。
引用:

SQL*PlusのSPOOL機能


というのを知らないので中途半端な回答になってしまいますが。

引用:

一部のカラムの文字列(全角カナ:VARCHAR2)に改行が含まれている為、
検索結果をCSV出力し、エクセル等で出力したCSVを開くと、改行部分で
1レコードが複数行に分割されてしまいます。


まぁ、そうであろうと思われます。CSVは基本的に
・カラム毎を','(カンマ)で区切る
・レコードを改行で区切る
ってのが通常の仕様なので。

引用:

改行コードの有無に関わらず、CSV出力時、1レコードは1行として表示させたい
のですが、どのようにすればいいかわかりません。


基本的にCSVで「改行を含むデータを扱う」場合、データ全体を
"(ダブルクォーテーション)で囲む必要があります。
エクセルにファイルをかませる前に、
あああ(改行)いいい

"あああ(改行)いいい"
と変更してみてもらえると、状況が少しは見えてくるかなぁ、と。

後は「該当環境でデータを"で囲って出力する方法」がわかれば
何とかなると思うのですが :-P
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-16 18:02
引用:

改行コードの有無に関わらず、CSV出力時、1レコードは1行として表示させたい
のですが、どのようにすればいいかわかりません。

SQLで改行コードを無効化できればいいのですが。。



改行コードを吹っ飛ばすだけで宜しいのでしたら、「REPLACE」関数を使って「CHR(10)」を「空文字列」にでも置換してあげれば大丈夫だと思います。
コード:

select replace(foo, CHR(10), '') from bar;



引用:

後は「該当環境でデータを"で囲って出力する方法」がわかれば
何とかなると思うのですが



コード:

select '"' || foo || '"' from bar;



でしょうか。この場合、より正確には

コード:

select '"' || replace(foo,'"','\"') || '"' from bar;



のような感じになるかと思いますが、CSV内での「"」のエスケープ規則に関してはちょっと記憶があやふやです。半端な回答ですみません……。

---
一部記述ミスがあったので修正しました。

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2004-09-16 18:11 ]
みきにゅう
会議室デビュー日: 2004/07/28
投稿数: 9
投稿日時: 2004-09-16 18:43
 > がるがる様、永井和彦様

早速のご返答ありがとうございます。
お二方のアドバイスにより、解決する事ができました。

 > 基本的にCSVで「改行を含むデータを扱う」場合、データ全体を
 > "(ダブルクォーテーション)で囲む必要があります。

 > 改行コードを吹っ飛ばすだけで宜しいのでしたら、「REPLACE」
 > 関数を使って「CHR(10)」を「空文字列」にでも置換してあげれば
 > 大丈夫だと思います。

このような出力が欲しかったのですが、わたしではどうすればいいのか
分からず、困っていました。

本当にありがとうございます。
今後ともどうぞよろしくお願いします。。
mode-A
会議室デビュー日: 2005/03/27
投稿数: 2
投稿日時: 2005-04-20 10:14
PostgreSQL(EUC_JP)環境からは、
下記の抽出方法で解決しました。

replace(foge,'¥r¥n', '')

(¥は半角)
*文字化けするので全角で書いています。
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2005-04-20 10:31
EXCELで表示することが前提であれば、Replace等で改行(CR+LF)を
LFのみに変換しましょう。そうすれば同一セル内で改行されますよ。

※行末のCR+LFは変換しちゃだめですけど。
※Windowsでの話。

[ メッセージ編集済み 編集者: Beatle 編集日時 2005-04-20 10:33 ]
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-04-20 10:59
引用:

みきにゅうさんの書き込み (2004-09-16 17:35) より:
はじめまして。

SQL*PlusのSPOOL機能を使用してSELECT結果をCSVに出力するところで
悩んでいます。

一部のカラムの文字列(全角カナ:VARCHAR2)に改行が含まれている為、
検索結果をCSV出力し、エクセル等で出力したCSVを開くと、改行部分で
1レコードが複数行に分割されてしまいます。



Excelでの表示が出来ればよいのであれば、ですが・・・
改行コードが含まれる列の値を""で囲むと、改行コードが入っていても
Excel上は1行になります

たとえば、
"aaa","bbb(改行)
ccc","ddd"(改行)
となっているCSVファイルをExcelで開くと
aaa bbb・ccc ddd
と表示されます。
(・はExcelのセルが折り返し表示になっていないので、改行コード=・で表示されている)

SQL文で '"' を1つめの列の前と、最後の列の後ろに文字列連結して
SET COLSEP '","'として実験したらできました。
(SQLPLUSコマンドで列を常に""でくくる方法がわからなかった(^^;
知っている方いらしたら教えてくださいませ)

#ちまっと編集(^^;

[ メッセージ編集済み 編集者: 夏椰 編集日時 2005-04-20 11:00 ]
1

スキルアップ/キャリアアップ(JOB@IT)