• 締切済み

forコマンドのdelimsオプションで「","」を指定したい

以下のような データにコンマが含まれる(単価の項目)CSVファイルから 特定の列を抽出したCSVファイルを作ります。 "顧客ID","住所(送先)","商品ID","商品名","単価","数量","出荷日", "001","○○市○○町○○","202","□□","1,500","10","2009/7/7" "顧客ID","住所(送先)","商品ID","商品名","単価","数量","出荷日", "002","○○市○○町△△","503","◎◎","1,980","5","2009/7/6" 現在は以下のようなバッチファイルで対応しています。 @echo off :顧客ごとのヘッダ情報の行を削除 type syukjnminohyo.csv | find /v "顧客" > temp1.txt :ファイルデータを環境変数に代入し :subでデータの区切りである「","」をタブに変換 for /f "tokens=1,* delims=" %%a in (temp1.txt) do ( set line=%%a call :sub ) :タブを区切りとして特定の列を抽出 for /f "tokens=1,2,5,6 delims= " %%a in (temp2.txt) do ( @echo "%%a","%%b","%%c","%%d" >> out.txt ) :sub set line=%line:","= % echo %line:"=% >> temp2.txt 途中でファイルも作られるなど エレガントでない部分が多いため 皆様のお力をお貸し頂きたく質問いたしました。 よろしくお願いします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

バッチでやるなら方針としてはそれしかないと思います。 中間ファイルを使わないようにすると、 @echo off (for /f "delims=" %%a in ('find /v "顧客" ^< syukjnminohyo.csv') do ( set line=%%a call :sub ))>out.txt goto :EOF :sub set line=%line:","=★% for /f "tokens=1,2,5,6 delims=★" %%a in ("%line:"=%") do ( echo "%%a","%%b","%%c","%%d" ) タブは見えないので、代わりに★を使いました。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

CSVはjetProvider経由でSQL発行したほうが簡単ですよ。 このあたりを参考にしてください。 http://tuka.s12.xrea.com/index.xcg?p=ADO csvのときは接続文字列が、 cnstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=フォルダ名;Extended Properties=""text;ReadOnly=True;HDR=YES;FMT=Delimited""" といった感じです。 HDR = YESはヘッダー部ありを意味しています。 あとは SELECT * FROM ファイル名 といった感じでSQLを発行し抽出してしまえばよいのです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

あれ? for のネストってできませんでしたっけ?

関連するQ&A