PLSQLで可変長のCSVファイルを読み込み、特殊文字がある項目をNULLにして出力する方法

このQ&Aのポイント
  • PLSQLを使用して、可変長のCSVファイルを読み込み、特殊文字がある項目をNULLにし、別のCSVファイルとして出力する方法について教えてください。
  • 質問者はPLSQLでマルチレイアウトのCSVファイルを読み込み、特殊文字を含んでいる項目をNULLにし、別のCSVファイルに出力したいと考えています。どのような方法で文字列の置換を行えば良いでしょうか?また、カラム数が不定な場合にも対応する方法を教えてください。
  • PLSQLを利用して、マルチレイアウトのCSVファイルを読み込み、特殊文字を含む項目をNULLにし、新しいCSVファイルに出力したいと思っています。文字列の置換について具体的な方法や、カラム数が不定な場合の対処法について教えてください。
回答を見る
  • ベストアンサー

PLSQLで文字列置換

よろしくお願いします。 PLSQLで可変長のCSVファイルを読み込み、ある特殊文字があった場合、その 特殊文字が含まれている項目ごとNULLにし、またCSVファイルを出力する。 というプログラムを作りたいのですが、CSVファイルの読込み、書き出しのやり方 は判ったのですが、文字列置換がどうすればいいかわかりません。 またファイルはマルチレイアウトで、カラム数とも不定です。 例) 入力ファイル: A,B,C,D,ABCDEFG,FF,GG となっている場合、'E'という文字があるカラムはNULLで出力する というときに 出力ファイル: A,B,C,D,,FF,GG としたいのです。 ご教授下さい。

  • Oracle
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > 文字列置換がどうすればいいかわかりません。 decode(instr(データ, '特殊文字'), 0, データ, NULL) でどうでしょう?

-Rena-
質問者

お礼

お返事ありがとうございます。 特殊文字が複数ある場合はどうすればよいでしょうか? またデータは [,]と[,]の間の文字としたいのですが どう判断させればよろしいでしょうか?

その他の回答 (3)

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.4

この手の作業はPL/SQLが苦手とする分野ですね。 Javaやほかのスクリプト言語(Perlなど)でプログラムした方が効率的だと思います。(PL/SQLで行わなければいけない理由が特に無い場合) 開発の制約でPL/SQLにこだわるのであれば、参考URLが役に立つと思います。

参考URL:
http://www.oracle.com/technology/oramag/code/tips2004/080904.html
-Rena-
質問者

お礼

お返事ありがとうございます。 PLSQLで作成しなければならず、いろいろ困っていました。 参考のURL情報大変、参考になります。 改良してなんとかやってみようと思います。 ありがとうございました。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 > decode(instr(データ,'特殊文字1')+instr(データ,'特殊文字2')+・・・ > instr(データ,'特殊文字N'),0,データ,null) 以下のように演算結果の符号部分のみdecode して下さい。 decode(sign(instr(...) + instr(...) + ...), 0, データ, NULL) > 「,」で区切られている間をデータとみなす方法がInstrとSUBSTRの組み合わせ > でできるとの事ですが、どのようにすればよいのでしょうか。 こんな感じでしょうか? substr(データ, instr(データ, ',') + 1, instr(データ, ',', 1, 2) - instr(データ, ',')-1) → 最初のカンマと2番目のカンマの間の文字をデータとして取り出します。   最初のカンマの次の文字から、2番目のカンマまでの文字数 - 最初のカンマ   までの文字数 -1文字を、間のデータと見なしています。   カンマの数が2個より少なかった場合の事は考慮していませんので、注意して下さい。

-Rena-
質問者

お礼

ありがとうございます。 SUBSTRのほうはなんとなくわかりました。 もうちょっと頑張ってみます。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 #1 のmuyoshid です。 > 特殊文字が複数ある場合はどうすればよいでしょうか? 特殊文字の数分instr の結果を足し算すればできますょ。 instr は、指定した文字が表れた場所を返してくれるので、 instr(データ, '特殊文字1') + instr(データ, '特殊文字2') + ... + instr(データ, '特殊文字n') を計算します。 計算結果の符合 (SIGN) をdecode すれば、 0:特殊文字無し 1:特殊文字有り となります。 Oracle9i であればcase 文が使えますが、この方法だとバージョン に依存せず使用できます。 > またデータは [,]と[,]の間の文字としたいのですが これは、instr とsubstr を組合せればカンマの中を取り出す事ができます。

-Rena-
質問者

補足

ありがとうございます。 decode(instr(データ,'特殊文字1')+instr(データ,'特殊文字2')+・・・ instr(データ,'特殊文字N'),0,データ,null) ということですよね。 よくわかりました。 「,」で区切られている間をデータとみなす方法がInstrとSUBSTRの組み合わせ でできるとの事ですが、どのようにすればよいのでしょうか。 なにからなにまですみません。 お願い致します。

関連するQ&A

  • VBスクリプト 文字列操作

    VBスクリプト(全くの初心者です)について教えてください。 例えば "test.csv" にて 1,a 1,b 1,c 1,d 2,a 2,b 3,d 3,e 4,a 4,f 4,g のファイルがあるとします。 最初の1列目の数字(文字列)の行数は可変です。 最終的に "test2.csv" 1,a,b,c,d 2,a,b 3,d,e 4,a,f,g というファイルを作りたいのですが,ずばりコードを教えていただけないでしょうか。

  • データ中の文字列置換方法

    以下の様なデータがあり項目Aが’B01’の場合は★として置換し、’B01’以外はNULL値として置換するSQL(ORACLE)について教示お願い致します。 <データの内容> 項目A A00 A01 B01 C01 B01 D01 <出力結果>      ←NULL      ←NULL ★      ←NULL ★      ←NULL

  • PLSQLで

    PLSQL(Oracle9.i)で以下のことをしようとしています。 しかし、コンパイルは通るがステップ実行すると固まります。 -- 宣言部 TYPE REC_A IS RECORD( a NUMBER, b NUMBER, c NUMBER, d NUMBER, e NUMBER, f NUMBER, g NUMBER, ); TYPE B_TBL IS TABLE OF REC_A INDEX BY BINARY_INTEGER; TYPE C_TBL IS TABLE OF B_TBL INDEX BY BINARY_INTEGER; D_TBL C_TBL; -- 関数部 FOR i IN 1..3 LOOP  FOR J IN 1..3 LOOP   D_TBL(I)(J).a := 1;   D_TBL(I)(J).b := 2;   D_TBL(I)(J).c := 3;   D_TBL(I)(J).d := 4;   D_TBL(I)(J).e := 5;   D_TBL(I)(J).f := 6;   D_TBL(I)(J).g := 7;  END LOOP; END LOOP; なにぶんまだPLSQLの勉強始めて1ヶ月満たないもので、分からないことをどう伝えればいいのかも分からない状況です。 処理的には、D_TBL(I)(J)に値をいろいろセットし集計をとりCSVにはきだす処理です。 これだけでは分からないかもしれませんが、よろしくお願いします。

  • PLSQLについて

    初心者の質問でほんとうにほんとうに申し訳ありません。 PLSQLでお伺い致しのですが、 例えば、もしaというパラメータがNULLだった場合に、 b_procというプロシージャを呼び出すという処理があったとして、 その呼び出したプロシージャのINパラメータを、NULLとして取得したい時の記述として、   IF a is NULL THEN b_proc(INパラメータ);    INパラメータ =: null;  ENDIF; という記述方法は正しいでしょうか? どなか教えて頂けませんか? よろしくお願い致します。

  • 多次元配列のキーをつないで文字列にする

    PHP5.4の配列で仮に次のようなものがあったとします。 <?php $arr['A']['B']['C']['D'] = null; $arr['A']['B']['D']['C'] = null; $arr['A']['B']['D'] = null; それぞれのキー名をつなぎあわせてそれぞれ「A, B, C, D」「A, B, D, C」「A, B, D」といった文字列に変換したいのですが、どのようにしたら実現できるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • 【コマンドプロンプト】テキストファイル内の文字列置換

    こんにちは。 コマンドプロンプトのバッチファイルでテキストファイル内の文字列の置換を行いたいと考えております。 例えば以下のような内容があった場合、 --開始-- ABCDEFG1111 ABCDEFG ABCDEFG1111 HIJKLMN --終了-- バッチファイル処理結果として 1111 ABCDEFG 1111 HIJKLMN という結果を別ファイルに出力したいのです。 制限としては、sed,awkなどのwindows上で稼動するツールがあるようですが それらは使用できません。 どなたかご存知の方教えていただけないでしょうか よろしくお願い致します。

  • sedでカンマ区切りの列の置換を行いたい

    以下の様なファイルがあります。 sedコマンドを使用して、カンマで区切られたn番目のカラム目を 置換したい場合どうすればよいでしょうか。 "1","2","3","4","5","6" "1234","12","34567","abcd","efg","hi" "a c","d f","12 34","0","AAA","" "g i","j l","45 67","0","BBB","2021" "m o","p r","3 2 1","1","ABC","" "123","456","","abc","efg","hij" ①1カラム目以外置換(1カラム目以降削除) sed 's/\(.*\),.*,.*,.*,.*,.*/\1/g' test.csv ②最後の6カラム目以外置換(6カラム目以外削除) sed 's/.*,.*,.*,.*,.*,\(.*\)/\1/g' test.csv ③3カラム目を置換(3カラム目を「""」だけにしたい) sed -e 's/\(.*\),\(.*\),.*,\(.*\),\(.*\),\(.*\)/\1,\2,"",\3,\4,\5/g' test.csv とできたのですが、 表現がないというか、置換対象文字列の条件、表現が長いというか、全カラムを指定しているので、 少し、短くできないものでしょうか。 ①パターン sed 's/\([^,]*\),.*/\1/g' test.csv ②パターン sed "s/.*,\([^,]*\)$/\1/g" test.csv の様にできました。 ③パターン 思いう浮かばず これで、できているので間違いはないかとおもいますが、 どうなのでしょうか。 なにかいい案はないでしょうか?

  • C言語でのCSVソートとデータ抽出について

    皆様、はじめまして。 この度、急ぎでプログラムをC言語で作成するように命じられました。 C言語は経験が無いと断ったのですが、要員確保が出来ない為、何とかしてくれとのこと。 本来なら自分で学習しながら、作成すべきなのですが、超短納期の為、その時間が取れません。 今回は誠に申し訳ないのですが、皆様のお力をお借り出来ないでしょうか。 宜しくお願いいたします。 仕様概要 ・CSVファイルを読み込み、2カラム目の項目(文字型)で昇順ソート(qsort)を行う。 ・ソートされた2カラム目の同一値毎に1カラム目(数値型)が最大値となるレコードを抽出する。 ・抽出されたレコードを新規CSVファイルに出力する。 入力CSV概要 ・レコード件数は日によって変わる ・カラム数は8つ ・各カラムの項目長は可変長 ・上記に伴いレコード長も可変長 入力ファイル例 39,"AAA3","B1","C1","D1","E1","F1","G1" 100,"AAA1","B2","C2","D2","E2","F2","G2" 101,"AAA2","B3","C3","D3","E3","F3","G3" 105,"AAA1","B4","C4","D4","E4","F4","G4" 102,"AA1","B5","C5","D5","E5","F5","G5" 99,"AAA2","B6","C6","D6","E6","F6","G6" 1019,"AAA3","B7","C7","D7","E7","F7","G7" 処理後に出力されるファイル 102,"AA1","B5","C5","D5","E5","F5","G5" 105,"AAA1","B4","C4","D4","E4","F4","G4" 101,"AAA2","B3","C3","D3","E3","F3","G3" 1019,"AAA3","B7","C7","D7","E7","F7","G7"

  • 文字列の置換えがうまくいきません

    A  B  C   1 *  11  11 2 *  12  12 3     13 4 *  14  13 5     15 6 *  16  14 7 *  17  15 上記のように B列の文字列を、A列の*がある行に対応するようにC列に並べ替えたいです。A列に*が無い行はそのC列の同じ行のセルは空けておきたいです。 A列の*の配置、B列の文字列は時々で変わります。 どのような関数・方法を用いれば上記のようなことができるでしょうか。 よろしくお願いします。