[前の記事]« FOR /F "usebackq tokens=*"がNT4ではエラー
[次の記事]「goto %1」のMeとXPでの違いについて »

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

▲カテゴリー「FOR .. IN ( ) DO..」索引へ

[NT系]連続したデミリタ(カンマ)があるファイルをfor in doで正しく編集したい

367.
連続したデミリタがあるファイルをfor in doで正しく編集したい
2005年04月07日(木) 23時45分
k-roh
●DOS/Windowsのバージョン: Windows2000Pro or Server

久しぶりに書き込みます。よろしくお願いします。

カンマだけで項目が区切られていて、ダブルコーテーションは使っていないCSVファイルがあります。
これをFor in do を使って特定の項目を削除するBATを作成しました。
ところが行によってデーターがない項目があり、そのカンマが連続した場所を
1つのデミリタとして判断してしまい、思ったように動いてくれません。
下の例では、本当はbbbbを消したいのですが、* がない行は
ccccが消えてしまうのです。
何か解決方法はありますでしょうか。
よろしくお願いします。

BATファイル中の記述:
FOR /F "tokens=1-4,6* delims=," %%i in (infile.csv) do @echo %%i,%%j,%%k,%%l,%%m,%%n>>outfile.csv

入力file(infile.csv):
111,222,*,aaaa,bbbb,cccc,dddd,eeee
111,222,,aaaa,bbbb,cccc,dddd,eeee

出力file(outfile.csv):
111,222,*,aaaa,cccc,dddd,eeee
111,222,aaaa,bbbb,dddd,eeee
368.
Re:連続したデミリタがあるファイルをfor in doで正しく編集したい
2005年04月08日(金) 02時34分
otn
>●DOS/Windowsのバージョン: Windows2000Pro or Server

>久しぶりに書き込みます。よろしくお願いします。

>カンマだけで項目が区切られていて、ダブルコーテーションは使っていないCSVファイルがあります。
>これをFor in do を使って特定の項目を削除するBATを作成しました。
>ところが行によってデーターがない項目があり、そのカンマが連続した場所を
>1つのデミリタとして判断してしまい、思ったように動いてくれません。
>下の例では、本当はbbbbを消したいのですが、* がない行は
>ccccが消えてしまうのです。
>何か解決方法はありますでしょうか。
>よろしくお願いします。

>BATファイル中の記述:
>FOR /F "tokens=1-4,6* delims=," %%i in (infile.csv) do @echo %%i,%%j,%%k,%%l,%%m,%%n>>outfile.csv

>入力file(infile.csv):
>111,222,*,aaaa,bbbb,cccc,dddd,eeee
>111,222,,aaaa,bbbb,cccc,dddd,eeee

>出力file(outfile.csv):
>111,222,*,aaaa,cccc,dddd,eeee
>111,222,aaaa,bbbb,dddd,eeee

連続したデリミタは1つのデリミタとみなすというのは仕様なのでどうしようもないですね。

行全体を一旦環境変数に入れて、データ中に含まれない文字例えば「★」を使って、「,,」を「,★,」に全置換後(*1)、for /f で必要なフィールドを選んで、また環境変数に入れ、「★」を置換で消す。というような地道なやり方しかないと思います。

*1: 「,,,」というケースもあるのなら置換を繰り返す必要があります。
371.
結果ですが。
2005年04月11日(月) 09時51分
k-roh
>連続したデリミタは1つのデリミタとみなすというのは仕様なのでどうしようもないですね。

>行全体を一旦環境変数に入れて、データ中に含まれない文字例えば「★」を使って、「,,」を「,★,」に全置換後(*1)、for /f で必要なフィールドを選んで、また環境変数に入れ、「★」を置換で消す。というような地道なやり方しかないと思います。

>*1: 「,,,」というケースもあるのなら置換を繰り返す必要があります。


回答ありがとうございます。
やはり仕様なんですか。

え~、それで結果から報告しますと、以下のようなBATを作ったのですが、
csvファイルのデーター中に & が見つかってしまい、泣く泣くEXEを作りました。(爆)
せっかくの回答でしたが、すみませんです。ありがとうございました。

----(bat start) ------------------------------------------
FOR /F "tokens=1* delims=" %%i in ( infile.csv ) do (set line=%%i && call :sub)

FOR /F "tokens=1-4,6* delims=," %%i in (WORKFL) do @echo %%i,%%j,%%k,%%l,%%m,%%n>>outfile.csv
exit

REM --- サブルーチン -------------------------------------------------
:sub
set LineStr=%line:,,=, ,%
echo %LineStr%>>WORKFL
373.
Re3:結果ですが。
2005年04月11日(月) 15時34分
otn
>やはり仕様なんですか。

>え~、それで結果から報告しますと、以下のようなBATを作ったのですが、
>csvファイルのデーター中に & が見つかってしまい、泣く泣くEXEを作りました。(爆)
>せっかくの回答でしたが、すみませんです。ありがとうございました。

>----(bat start) ------------------------------------------
>FOR /F "tokens=1* delims=" %%i in ( infile.csv ) do (set line=%%i && call :sub)

>FOR /F "tokens=1-4,6* delims=," %%i in (WORKFL) do @echo %%i,%%j,%%k,%%l,%%m,%%n>>outfile.csv
>exit

>REM --- サブルーチン -------------------------------------------------
>:sub
>set LineStr=%line:,,=, ,%
>echo %LineStr%>>WORKFL

データ中に & < > 等が含まれても、" を含まないならば、set "変数=値" を使うとうまく行きます。

del outfile.csv 2>NUL
FOR /F "delims=" %%i in ( infile.csv ) do (set line=%%i& call :sub)
exit /b

REM --- サブルーチン -------------------------------------------------
:sub
set "LineStr=%line:,,=, ,%"
set "LineStr=%LineStr:,,=, ,%"
FOR /F "tokens=1-4,6* delims=," %%i in ("%LineStr%") do @echo %%i,%%j,%%k,%%l,%%m,%%n>>outfile.csv

カンマが3連続以上しても良いように置換を2回しておきます。
374.
Re4:結果ですが。
2005年04月11日(月) 16時33分
k-roh
>データ中に & < > 等が含まれても、" を含まないならば、set "変数=値" を使うとうまく行きます。

え゛、そうなんですか。
知らなかったです。ありがとうございます。
 
 


カテゴリー「FOR .. IN ( ) DO..」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2005年04月07日 13:40に投稿されたエントリーのページです。

ひとつ前の投稿は「FOR /F "usebackq tokens=*"がNT4ではエラー」です。

次の投稿は「「goto %1」のMeとXPでの違いについて」です。

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

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