プロが教えるわが家の防犯対策術!

以下のような
データにコンマが含まれる(単価の項目)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


途中でファイルも作られるなど
エレガントでない部分が多いため
皆様のお力をお貸し頂きたく質問いたしました。
よろしくお願いします。

A 回答 (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"
)

タブは見えないので、代わりに★を使いました。
    • good
    • 0

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を発行し抽出してしまえばよいのです。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!