• ベストアンサー

CSVファイル中の文字列項目の中に混じった

CSVファイルからRDBへのロードで悩んでいます。 以下の様なCSVファイルがあり (よくあることかもしれませんが)データの中に " が混じっているため、正常にデータをロードできません。 文字列データ中の " を削除するか、代替文字に置換したいのですが、 なにかいい知恵は無いでしょうか? 例: $ cat DATA.csv 10,"0010","教育","キョウイク",2300 20,"0110","美容&健康","ヒ"ヨウ&ケンコウ",2300   ←ビ ではなく ヒ" 30,"1010","趣味","シュミ",2312 40,"0030","マネー","マネー",3300 ただし、 ・CSVを作成するプログラムの関係で、   CSVファイル中の ,区切り "括りルールは変更できない ・ファイルは可変長 ・誤った " は上記以外にも無数に予想されること   レコード件数が多いこと から、   sedなど自動化された方式が望ましい ・OS は Solaris8 ・RDB は Oracle9i ・シェアウェアなどのオンラインソフトの使用は不可 ・文字列データ中の " はすべて誤った文字と見なして良い  (もちろん括り文字 " は生かすこと) 正規表現を用いてsedでなんとかならんか?といろいろ試行錯誤してみたのですが、 イマイチうまくいきません。 どうかよろしくお願いします。

  • chaff
  • お礼率92% (78/84)

質問者が選んだベストアンサー

  • ベストアンサー
  • SIRAP2005
  • ベストアンサー率100% (1/1)
回答No.1

括り文字としての「"」は必ず区切り文字の「,」と連続しているという法則は生かせませんか・・・。 「",」もしくは「,"」

chaff
質問者

補足

ありがとうございます。なるほど。 "," → めったに使わない文字その1 ", → めったに使わない文字その2 ," → めったに使わない文字その3 "[改行] → めったに使わない文字その4 [改行]" → めったに使わない文字その5 " →(代替文字) めったに使わない文字その5→[改行]" めったに使わない文字その4→"[改行] めったに使わない文字その3→," めったに使わない文字その2→", めったに使わない文字その1→"," の順で置換していくわけですね。 リソースが少し気になりますが、明日試してみます。

その他の回答 (2)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.3

処理系にもよるのですが、文字列または数字として認識するという前提で次のような方針でやれそうです 1.次の1行を読み込む 2.カンマをサーチして各項を文字列として分離する 3.文字列の最初と最後をチェックする 4a.""でくくられている場合、最初と最後の""をいったん取り去り、さらに"があれば、誤った文字とみなして適当な変換を施す。 4b.""でくくられていない場合、数字とみなして、そのままにする 5.上記4で変換した行データ全体を出力する 6.1にもどる いかがでしょう。 perlならまあそこそこ簡単に出来そうですね。

chaff
質問者

補足

ありがとうございます。 ここまでくるともうプログラムの世界ですね。 当方、10年ほど前にsed & awkをかじったくらいでperlまでくると正直敷居が高いです。perlは知っている人に言わせると「かんたんだよ」なんて答えが返ってくるようですが... この場を借りて、皆さんへのお礼&お詫びとさせていただきたいのですが、実は結論が出ました。 実は件のCSVデータですが、全部で 770,000行ほどありまして、問題となっている 「"誤り」は現時点で 29件です。(実に 1/27,000 !) 試しに770,000行すべての " を単純に削除してみると、処理時間が約1時間程かかってしまいました。 「こりゃイカン。シノゴノ言っている場合じゃないよ。」 「エラーとなったBADファイルは比較的短時間で抽出できるのだから、この文字列中の " はエンドユーザへの『制限事項』(所謂'ごめんなさい')ということにして、とにかくSQL*Loader の処理完了を優先させよう。顧客交渉はSEに任せろ。」(「SE的な総合判断」というヤツですね) と、なりました。 こちらから数々のルールを課しておいて、ルールに則ってアイディアを出してくださった皆さんには申し訳ないのですが、終わってみれば s/\"//g で1時間ガマンというつまらん結果になってしまいました。 と、言うワケでほんとうに皆さん 申し訳ない!ありがとうございました。

  • sa-pon
  • ベストアンサー率15% (5/32)
回答No.2

ビ ではなく ヒ" ↑が問題なんですよね?即ち濁点のカタカナ? 私はプログラムに精通している者ではありませんが、 ロードDATを加工する...という発想ではいかがでしょうか? つまり一括変換をカ行、サ行、タ行、ハ行で行う...? カ"→ガ・・・・・・・・・・・コ"→ゴ サ"→ザ・・・・・・・・・・・ソ"→ゾ ・ ・ ハ"→バ・・・・・・・・・・・ホ"→ボ もしかしたら他にも「"」の可能性があるのでしょうか?

chaff
質問者

補足

ありがとうございます。 >もしかしたら他にも「"」の可能性があるのでしょうか? これは、私のたとえがまずかったです。 ご指摘の通り、問題は「濁点」ではなくあくまで「文字列データ中の "」にあります。 つまり、問題のパターンとしては ・"P"S2" ・"13"21'" ・"シ"ヤイアントハ"ハ"" など無数にあるという意味です。 確かに五十音のパターンだけなのであれば、狙いもつけられるんですがねー。

関連するQ&A

  • CSVファイルの列抽出について

    以下のCSV形式のファイルにて 左から4・6つ目の列(カンマにて区切られています)を 「sed」等にて抜き取ることは可能でしょうか? よろしくお願いします。 09/16/2006,9570.461538,0,9570.461538,99.44966667,99.997,99.72333333,0,0, 09/17/2006,9570.461538,0,9570.461538,99.44966667,99.997,99.72333333,0,0, 09/18/2006,9570.461538,0,9570.461538,99.44966667,99.997,99.72333333,0,0,

  • csv ファイルのデータを文字列として開く

    csv ファイルを開いた時に、最初から 全てのセルの 「セルの書式設定 > 分類」を「文字列」にすることは出来ますか? 一度、拡張子を txt に変えて 「テキスト ファイル ウィザード」 「列のデータ形式」を文字列にするのは知っているのですが、 ・拡張子を変える ・エクセルを開く ・ファイルを選ぶ ・全ての列を選択 ・文字列にする と非常に面倒なので csv ファイルのままでファイルを開いたら 最初から文字列にする方法を探してます。 お願いします。

  • CSVファイルを全て文字列型で開く

    CSVファイルをEXEL2000で参照する際に全ての項目を文字列型で表示したいと思います。 「外部データの取り込み―>テキストファイルのインポート」 ではなくて、SendToやマクロなんかを使ってなにか良い方法があればと思うのですがなかなか思いつかないので、アドバイス等ありましたらお願い致します。 (要はユーザーさんにCSVをダブルクリックで開いて欲しくないのです。「001」 -> 「1」とかになってしまうから。)

  • sedで「(~)」を使って文字列の一部を取り出し

    sedで「(~)」を使って、文字列の一部を取り出したいのですが期待した結果になりません。 以下のようなファイルがあります。 そこから、最初に見つかった「A-Z0-9」を含む文字列を取り出したいのですが、 どうしても、2番目にでてくる「0-9」でなる文字列が取り出されます。 環境は、Solaris/Linuxになります。 ■ファイル cat aaa "aaa","bbb","ccc","123456","ddd","eee","fff,"0000","ggg" "aaa","bbb","ccc","AAA123","ddd","eee","fff,"0000","ggg" ■sed sed 's/.*,"\([A-Z0-9].*[0-9]\)",.*$/\1/g' aaa ■結果 0000 0000 期待する結果は、 123456 AAA123 なのですが、 期待した結果を取り出すにはどうしたらよいのでしょうか。

  • CSVファイルへの文字列データの書き出しについて

    OS:WindowsXP、Excel:2003 です。 Excelマクロ(VBA)で、あるデータをCSVファイルに出力しているのですが、 文字列型(String)を書き出すと、必ずダブルクォーテーションで囲まれます。 CSVへ書き出すときは、そういう仕様になっているということは分かったのですが、 処理の都合上、どうしてもダブルクォーテーションで囲まずに書き出ししたいと思っています。 そういう場合にはどのようにすれば良いのか教えて下さい。 ちなみに、書き出しは「Write」を使っています。

  • CSVファイルの文字列を置換したい

    こんばんは。 CSVファイルが5000ファイル程あります。 それぞれのファイルのある特定の文字列を、一括で 置換する必要があります。 このファイル一つ一つを開いて、手動で置換していた のでは気が遠くなってしまいます。 なにか良いフリーソフトは無いでしょうか? ご存知の方よろしくおねがいします。

  • 16384列を超えるCSVファイルについて

    xcelのVBAマクロ初心者のため、ぜひお知恵をお貸しください。 16384列をこえ、Excel上で全てのデータが参照できないCSVファイルがあり、(行は千程度) 一行目は文字列でかかれています。 例: a b C(以降は二万件) 1 ¥イチゴ¥トチオトメ ¥米¥ササニシキ 2 100 200 3 200 500 (4以降は1000行ほど) 1行目の文字列データを識別して別シートに一覧を表示するマクロを作成したいのですが、 (たとえば、¥米のグループのみを別シートに一覧表示する) こちらのマクロを作成する際、どういったやり方で行えばいいか全く思い付きません。 まず、この表示できないCSVファイルをどのようにすればうまくいくのでしょうか? 色々かんがえたのですが、まず、テキスト化させると、一行目、二行目がまとまってしまい、識別することができません。 表示可能な列数に分割することや、表示が可能なワードやアクセスにインポートする等はできるのでしょうか。 セキュリティのため、フリーソフトの類いは使えない状態です。 Excelは2016です。よろしくお願いします。

  • CSVファイルについて

     文字ピタを使用してある印刷を行っており、CSVファイルを参照しています。しかし、CSVデータの中のある欄(口座番号・・・頭にゼロが付く)を文字列にして保存しても、再度開くと数値(頭のゼロが取れてしまう)になってしまいます。何か良い方法は無いでしょうか?

  • CSVデータの文字列置換

    かなり、困っております・・・。 「c:\csv_data」に複数のcsvデータが入っており、csvに含まれている "00ABC"を"00000"に変換させたいです。 (フォルダ内の全てのcsvを変換させたいです) 一度作ってみたんですが、Excel-VBAでCSVファイルを開いて編集をかけると書式が失われてしまう為、だめでした・・・。 そこで ・Excel-VBAでの良い方法 ・BATファイルで拡張子csv⇒txtに開いてからの編集⇒csvへ といった2つの方法(どちらか)がであれば作業工程上、他の処理と同時に 自動化できることからこの2つの方法での文字列変換方法を知りたいです。

  • CSVファイルのデータ型について

    初めて質問します。よろしくお願いします。 拡張子「.xls」のファイルを「.csv」に変えるときに、データの形が変わってしまいます。 (エクセルでは「001」(文字列)のものが、CSVで保存すると「1」(数値)となってしまう) これを解決するために エクセルから文字列のデータを持ってきて貼り付け・保存しようとしましたが、 何度やってもデータは数値になってしまいます。 データ量が多いので、手ではとても直せません。。。 どなたか、よい方法がありましたらご教授ください。

専門家に質問してみよう