[前の記事]« 指定の時間内のデータのみGETする方法
[次の記事][KR.EXE]長時間経過しても終了しない »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「FIND,FINDSTR,SORT…テキストファイル内文字列の操作」索引へ

CSVファイルから余分なダブルクォーテーションを除去したい

269.
テキストファイルの処理
2004年02月26日(木) 09時50分
shim
こんにちは。バッチを作りたいのですが初心者なものでさっぱりな状態です。
もしよろしければ、回答をお願いします。
OSはXPです。

カンマ区切りテキストファイル(CSV)を読み込んで
その中で使われているダブルコーテーション(")を取り除きたいです。

ただ、条件がありまして...
「"あいうえお","かきくけこ","さしすせそ"」→「"あいうえお","かきくけこ","さしすせそ"」
「"あいう"えお","かき"く"けこ","さしすせそ"」→「"あいうえお","かきくけこ","さしすせそ"」

といように、カンマの前後にあるダブルコーテーションと
行の最初と最後にあるダブルコーテーションは取り除かないで、
文字の中にあるダブルコーテーションを取り除きたいです。

よろしければアドバイスをお願いします。
278.
Re:テキストファイルの処理
2004年02月26日(木) 22時36分
oo
>カンマ区切りテキストファイル(CSV)を読み込んで
>その中で使われているダブルコーテーション(")を取り除きたいです。

>ただ、条件がありまして...
>「"あいうえお","かきくけこ","さしすせそ"」→「"あいうえお","かきくけこ","さしすせそ"」
>「"あいう"えお","かき"く"けこ","さしすせそ"」→「"あいうえお","かきくけこ","さしすせそ"」

>といように、カンマの前後にあるダブルコーテーションと
>行の最初と最後にあるダブルコーテーションは取り除かないで、
>文字の中にあるダブルコーテーションを取り除きたいです。

バッチスクリプトは文字列処理が苦手です。Excelがあれば、Excelにcsvを読み込んで"を削除して再度csvで書き出すというVBAを書くのが一番楽だと思います。
もし、データ中に、「半角空白 , ; : < | > & ^ ! % = 」等が一切含まれないという保証があれば("のほかは英数字と全角文字程度)、一旦全部の " を削除して後で , で区切られた単位で " を付け直すという手法で出来ますが。
@echo off
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%A in ("%~1") do (
rem ↑オペラントで指定したファイルから1行ずつ読む
 set B=%%A
 set C=!B:"=!
rem ↑一旦 " を全部削除する
 set X=
rem ↓カンマで区切られた要素ごとに
 for %%Y in (!C!) do set X=!X!,"%%Y"
rem ↑ " " で囲みながら , で区切って1行につなげる
 echo.!X:~1!
rem ↑ 先頭のカンマが1つ余分なので2文字目から表示
)
ファイル中に上述の特殊文字があるとどこかで破綻します。

特殊文字を含んだファイルで、Excelも使え無いなら、VBScript等で1文字ずつ調べて処理するしかないでしょうね。可能ですがかなり面倒だと思います。Cが使えればそのほうが楽かも。

ところで、csvデータ中の"って、それでいいんでしたっけ?
「"あいう""えお","かき""く""けこ","さしすせそ"」
では?
282.
Re:テキストファイルの処理
2004年02月28日(土) 00時20分
Hellcat
>といように、カンマの前後にあるダブルコーテーションと
>行の最初と最後にあるダブルコーテーションは取り除かないで、
>文字の中にあるダブルコーテーションを取り除きたいです。

このような処理にはタグ付正規表現が使えるツールを使うと楽に対応できます。
ちょっと古いツールですが、痒いところに手の届くSEDコマンドを使った処理を紹介します。

SED -e s/\([^,]\)\(\"\)\([^,]\)/\1\3/g < input.csv > output.csv

上記は、前後を半角コンマ以外の文字に挟まれた半角ダブルクオーテーション(1個)を削除するものです。
1行の中に上記条件に該当する半角ダブルクオーテーションが複数個ある場合は、それらがすべて削除されます。
文字列は全角・半角どちらでもOKです。

谷本孝浩氏作成のSEDコマンドでWin95上で動作確認を行いました。
WinXP上でも多分問題なく動くと思います。
このコマンドは以下にあります。
http://www.vector.co.jp/soft/dos/util/se008493.html
283.
Re2:テキストファイルの処理
2004年02月28日(土) 03時59分
oo
ooです。
標準ツールだけでやりたい人と、そう書いてない人がいるのでちょっと混乱してました。

>このような処理にはタグ付正規表現が使えるツールを使うと楽に対応できます。
>ちょっと古いツールですが、痒いところに手の届くSEDコマンドを使った処理を紹介します。

>SED -e s/\([^,]\)\(\"\)\([^,]\)/\1\3/g < input.csv > output.csv

おっしゃるように、sed がシンプルでいいでしょうね。ただ、これだと、
"かき"く"けこ","はひ""ふへほ"
等が、うまく行きますか?
SED -e :L -e s/\([^,]\)\"\([^,]\)/\1\2/ -e tL < input.csv > output.csv
とループさせる必要があると思います。あと、^ はCMD.exe の特殊記号なので、W2K,WXPでは、コマンドラインやバッチ中では、
SED -e :L -e s/\([^^,]\)\"\([^^,]\)/\1\2/ -e tL < input.csv > output.csv
と、^を重ねる必要があります。(NT4はよく知らないけど)
こういうコマンドラインの特殊性を考えなくていいように、別途ファイル file に
:L
s/\([^,]\)"\([^,]\)/\1\2/
tL
と書いて、sed -f file < input.csv > output.csv
がお勧めです。

あと標準ツールの話に戻ると、実はVBScriptって正規表現が使えるので意外と簡単でした。sedよりはずっと長いですけど。
Dim StdIn, StdOut, regEX, str
Set StdIn = WScript.StdIn
Set StdOut = WScript.StdOut
Set regEx = New RegExp
regEX.Pattern = "([^,])""([^,])"
While Not StdIn.AtEndOfStream
     str = StdIn.ReadLine
     while regEX.Test(str) 
       str=regEX.Replace(str,"$1$2")
     wend
     StdOut.WriteLine  str
wend
これを、file.vbs に書いて、
cscript //nologo file.vbs < input.csv > output.csv
284.
Re3:テキストファイルの処理
2004年02月28日(土) 09時34分
Hellcat
ooさん、フォローありがとうございます。

>"かき"く"けこ","はひ""ふへほ"等が、うまく行きますか?
「"く"」の条件は見落としました。shimさんの例示にあがっていましたね。
確かに私のやり方ではこれは処理できません。(^^;

「ひ""ふ」のようにdouble quotationが連続するケースは\([\"]\+\)でテストを行い処理できましたが、shimさんの例示になかったので、
>上記は、前後を半角コンマ以外の文字に挟まれた半角ダブルクオーテーション(1個)を削除するものです。
としたものです。←言い訳mode

ooさんのようにloopさせることで、これらの問題は一挙に解決しますね。(^^)

>^を重ねる必要があります。
そうでした、そうでした。(^^;;
XPが手許にないので、テストできなかったのですが、circumflexはエスケープしなければいけませんね。

followありがとうございました。m(_ _)m

p.s.
よくよく考えると、マッチさせるdouble quotationを\2に割り当てる必要はなかったのですね。(^^;;;
 
 


カテゴリー「FIND,FINDSTR,SORT…テキストファイル内文字列の操作」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2004年02月26日 17:18に投稿されたエントリーのページです。

ひとつ前の投稿は「指定の時間内のデータのみGETする方法」です。

次の投稿は「[KR.EXE]長時間経過しても終了しない」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート