今だけ人気マンガ100円レンタル特集♪

バッチファイルで一行に、118項目のあるCSVファイルを読み込んで、必要な項目を抽出して、新しいCSVを作りたいです。
いろいろ調べたら
for /f "delims=, tokens=1-3" %%I in (sample.csv) do (
echo %%I %%J %%K>> new.csv
)
で実現できると思っていましたが、tokensに値の制限があって、tokens=1-118にすると、うまくいかないです。
どなたかいい方法をご存知でしたら、教えていただきたいですが。

A 回答 (4件)

過去に同様の質問で回答しています→

http://oshiete.goo.ne.jp/qa/4939331.html の A No.3 の内容を再掲します。

for文の2重ループで分解する方法で、2,32,33,35項目を抜き出しているところが echo ![2]!,![32]!,![33]!,![35]! になります。

echo off
setlocal ENABLEDELAYEDEXPANSION
for /F "delims=" %%A in (sample.csv) do (
set n=
for %%a in (%%A) do (
set /a n=n+1
set [!n!]=%%a
)
echo ![2]!,![32]!,![33]!,![35]!
)
endlocal
    • good
    • 1

その他プログラミングの方がよさそうな質問ですね。



テキスト処理であればawkが良いと思います。Windows版もあるようですが、cygwinにも入っています。

cygwinを導入したとして説明します。

sh後

cat 対象ファイル名 | awk \
'BEGIN { }
{
split $0,A,","
Print A[1] "," A[3] "," A[118:
}
END { }' > 出力ファイル名.csv

とすれば、1,3,118列目が出力されます。

ご検討あれ。

※最近のcygwinは改行コードが\n(0x0a)になっています。ファイルにする場合には注意してください。
    • good
    • 0

for のヘルプを見ればわかるんだけど, 1つの for では最大 26個しか使うことができません (%a~%z, あるいは %A~%Z まで). だから「118個を同時に扱う」ことは「バッチファイル」では不可能です.


「バッチファイルでは」というのは, PowerShell では多分できるから. VBScript でもできるかも.
    • good
    • 0

本当に 118個全部必要なの?


もし必要なら, (少なくとも「バッチファイル」では) 不可能.
    • good
    • 1
この回答へのお礼

ありがとうございます。もとのCSVファイルは118項目が有りますので、それを順番で読み込み、特定の列を新たなCSVに吐き出したいですね。バッチ以外で考えないといけないみたいですね。

お礼日時:2010/11/29 01:06

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qバッチでcsvファイルの指定のカラムを編集したい

バッチでファイルの編集をしたい

バッチファイルを使用して、csvファイルの読み込み~編集を行いたいと思っております

元ファイル:TEST_DATA.csv
内容:
111,222,333,444,555
123,456,789,321,987


上記のcsvファイルを読み込み、
・5カラム目が987ならば3カラム目を654に変更する
という処理を実行させたいのですが、
どのように行えばよいのでしょうか?

現在考えていることは、
1.for文を使用して指定のカラムを抜く(3カラム目と5カラム目を抜く))
2.5カラム目の値をif条件に指定し、合致した場合、抜いた3カラム目の変数に654を入れる
3.654に変更した変数を3カラム目の値として入れる

という順番で行えばいいと思っているのですが、
下記まで行ったところで行き詰ってしまいました

for /F "tokens=3,5 delims=," %%i IN (TEST_DATA.csv) DO @(if %%j==987 set %%i=654 echo %i %j )



お分かりになられる方、ご教授願えませんでしょうか

バッチでファイルの編集をしたい

バッチファイルを使用して、csvファイルの読み込み~編集を行いたいと思っております

元ファイル:TEST_DATA.csv
内容:
111,222,333,444,555
123,456,789,321,987


上記のcsvファイルを読み込み、
・5カラム目が987ならば3カラム目を654に変更する
という処理を実行させたいのですが、
どのように行えばよいのでしょうか?

現在考えていることは、
1.for文を使用して指定のカラムを抜く(3カラム目と5カラム目を抜く))
2.5カラム目の値をif条件に指定し、合致した場合、抜...続きを読む

Aベストアンサー

5カラムまであるとして、

for /f "tokens=1-5 delims=," %%A in (TEST_DATA.csv) do (
if %%E == 987 (echo %%A,%%B,654,%%D,%%E) else (echo %%A,%%B,%%C,%%D,%%E)
)

もっと他の条件があれば、さらに複雑な処理になります。

QバッチファイルのFOR文について【tokens~】

お世話になっております
バッチファイルの、文字列操作で
----------------------------------------------------------
FOR /F "eol=; tokens=2,32 delims=, " %i in (myfile.csv) do @echo %i %j %k
----------------------------------------------------------
のtokensで指定している32列目(カンマが32個目)以降の値を
取得しません。
なぜでしょうか。

下記のHPを参照すると、一度変数をクリアしそのしたでさらにForで
指定すればよいとのことなのですが、欲しい値が多すぎて
とても、Forのしたに何度書きたくありません。
http://folomy.jp/heart/?m=pc&a=page_c_topic_detail&target_c_commu_topic_id=12560
どのようにしたら、目的を果たせるのでしょうか。
ご教授ください。

お世話になっております
バッチファイルの、文字列操作で
----------------------------------------------------------
FOR /F "eol=; tokens=2,32 delims=, " %i in (myfile.csv) do @echo %i %j %k
----------------------------------------------------------
のtokensで指定している32列目(カンマが32個目)以降の値を
取得しません。
なぜでしょうか。

下記のHPを参照すると、一度変数をクリアしそのしたでさらにForで
指定すればよいとのことなのですが、欲しい値が多すぎて
とても、Forのした...続きを読む

Aベストアンサー

#1です。
リンク先を見落としていました。今試してみしたら確かに32以降は指定しても取得できないようです。仕様ですかね。
具体的にどれくらいの列を指示したいのでしょうか。
リンク先のような方法か、call文の引数で渡してサブルーチンで分解するくらいしか方法が思いつきません。スミマセン。

Qバッチでテキストファイルから任意の行のみ取得したい

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数T...続きを読む

Aベストアンサー

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?

findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

Q特定の列の抽出

CSVファイルがあり特定の列を抽出したいんですが、excelが入ってなくマクロ(VB)が使用できない為、そのような処理をバッチで処理することは可能でしょうか?教えてください。ちなみに抽出条件は日付です。

Aベストアンサー

VBScript版のサンプル
(ハイフン)以下の部分をcollect.vbsのように名前を付けたとしたら
CScript /nologo collect.vbs < data.csv > outdata.txt
の様に実行します。
-----------------------------------------------------------
dim d, str, data, dateData
dim StdIn, StdOut
Set StdIn = WScript.StdIn
Set StdOut = WScript.StdOut
d=Date

Do While Not StdIn.AtEndOfStream
str = StdIn.ReadLine
data = split(str, ",")
dateData = split(data(0)) 'data書式:Sun May 16
if UCASE(dateData(0)) = UCASE(WeekdayName(Weekday(d),true)) and _
UCASE(dateData(1)) = UCASE(MonthName(Month(d),true)) and _
UCASE(dateData(2)) = UCASE(DatePart("d", d)) then
StdOut.WriteLine data(2)
end if
Loop

'MonthNameの英語のみ版
'標準のMonthNameは、システムの設定(言語)で変わる
function MonthName( n , flag)
dim name

name= Array( _
"January", "February", "March", "April", "May", "June", _
"July", "August", "September", "October", "November", "December")
if flag then
MonthName=left(name(n-1),3)
else
MonthName=name(n-1)
end if

end function

function WeekdayName( n , flag)
dim name

name= Array( _
"Sunday", "Monday", "Tuesday", "Wednesday", _
"Thursday", "Friday", "Saturday" )
if flag then
WeekdayName=left(name(n-1),3)
else
WeekdayName=name(n-1)
end if

end function

VBScript版のサンプル
(ハイフン)以下の部分をcollect.vbsのように名前を付けたとしたら
CScript /nologo collect.vbs < data.csv > outdata.txt
の様に実行します。
-----------------------------------------------------------
dim d, str, data, dateData
dim StdIn, StdOut
Set StdIn = WScript.StdIn
Set StdOut = WScript.StdOut
d=Date

Do While Not StdIn.AtEndOfStream
str = StdIn.ReadLine
data = split(str, ",")
dateData = split(data(0)) 'data書式:Sun May 16
...続きを読む

Q「,」区切りのcsvファイルを検索して文字列抽出したい

環境:windows2000
csvファイル形式:
pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9
バッチファイルに引数%A%を渡してcsvファイルを検索します。
検索文字列は引数%A%です。一行目に検索しようとする文字列があると
それを%%Jにset してあげます。最後に渡された引数とセットされた文字列が同じであればOKです。
自分で考えたのですがなかなかうまくいきません。
みなさまのご教授おねがいします。
FOR /F "tokens=1 delims=," %%l in ('findstr /R "%1" rrr.csv') do set palam=%%l
echo "渡された引数 [%1] "
echo "セットされた文字列 [%palam%] "
if "%palam%" NEQ "%1" (
goto :erro_end
)
引数は「pat」を渡したのですがセットされた文字列が「pat_a」
になってしまうんです。

環境:windows2000
csvファイル形式:
pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9
バッチファイルに引数%A%を渡してcsvファイルを検索します。
検索文字列は引数%A%です。一行目に検索しようとする文字列があると
それを%%Jにset してあげます。最後に渡された引数とセットされた文字列が同じであればOKです。
自分で考えたのですがなかなかうまくいきません。
みなさまのご教授おねがいします。
FOR /F "tokens=1 delims=," %%l in ('findstr /...続きを読む

Aベストアンサー

カンマをつけてうまくいく理由は、

FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l

が処理されるとき、まず
findstr /R "^%1," rrr.csv
の部分が処理されるからです。この時点ではまだカンマでは区切られず、

pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9

が findstr にそのまま渡されます。したがって、pat だけで検索すると、pat も pat_a も該当してしまいます。

しかしCSVファイルなので、最初の項目の次には必ずカンマが来ることを利用して、 pat, で検索すると、1行目だけが該当します。

この結果が FOR 文の中で展開され、

FOR /F "tokens=1 delims=," %%l in ("pat,\path1\path2,\path\path3") do set palam=%%l

のようになり、ここではじめて delims=, が効いてカンマで区切られ、palam に pat が代入されます。

カンマをつけてうまくいく理由は、

FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l

が処理されるとき、まず
findstr /R "^%1," rrr.csv
の部分が処理されるからです。この時点ではまだカンマでは区切られず、

pat,\path1\path2,\path\path3
pat_a,\path4\path5,\path7\path8
pat_a,\path7\path6,\path8\path9

が findstr にそのまま渡されます。したがって、pat だけで検索すると、pat も pat_a も該当してしまいます。

しかしCSVファイルなので、最初の...続きを読む

Qbatファイル処理でのテキストファイルの内容を編集

batファイル処理のみにてテキストファイルの内容を編集する事は可能でしょうか。

例えば
aaa=0
bbb=0
ccc=0
ddd=0

という内容のテキストファイルが存在し、batファイルにて
aaa=0
bbb=1
ccc=1
ddd=0

というように、指定行の内容を変更させたいのですが、この処理をbatファイルのみで行う事は可能でしょうか。

宜しくお願いします。

Aベストアンサー

こんな感じですか?
パスは適切に設定してください
----- a.bat -----
cd c:\foo\bar
if exist test.bak goto skip
copy test.ini test.bak
cscript a:\hogehoge\replace.vbs test.ini
:skip
----- a.bat ここまで -----

----- replace.vbs -----
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
objFile.Close
strText = Replace(strText, "bbb=0", "bbb=1")
strText = Replace(strText, "ccc=0", "ccc=1")

Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.WriteLine strText
objFile.Close
----- replace.vbs ここまで -----

参考URL:http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx

こんな感じですか?
パスは適切に設定してください
----- a.bat -----
cd c:\foo\bar
if exist test.bak goto skip
copy test.ini test.bak
cscript a:\hogehoge\replace.vbs test.ini
:skip
----- a.bat ここまで -----

----- replace.vbs -----
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
obj...続きを読む

Qバッチファイル 文字列にスペースがある場合

for /f %%A in ('dir /b /s c:\a aa*.pdf') do copy "%%A" D:\

これはcドライブのa aaというフォルダ名の中を検索するコードですが、
フォルダ名にスペースがあるため、うまく動きません。

"a aa"のように""で囲ってみましたが、駄目でした。

どうすれば良いのか、教えていただきたいので、お願いします。

Aベストアンサー

for /f %%A in ('dir /b /s c:\"a aa"\*.pdf') do echo copy "%%A" D:\
のようにecho でどのようなコマンドが実行されているか確認しましょう。

この記述ではdirコマンドで表示されるパスの中に空白があるため %%A には空白までの文字列しか代入されません。
以下のように修正して試してみてください。

for /f "delims=" %%A in ('dir /b /s c:\"a aa"\*.pdf') do copy "%%A" D:\

QDOSのバッチで、テキストファイル中の文字を置換したい

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
:この1行下の acb=xyz に置換前と置換後の文字列を指定する。
set l=%line:abc=xyz%
echo %l%>>%fname%
goto :EOF

:end
======================

これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。

これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に

set mae=abc
set ato=xyz

の2行を加え、変数に値を設定するようにしました。

ところが、次の1行の書き変え方がわかりません。

set l=%line:abc=xyz%



set l=%line:%abc%=%xyz%%

のように変えてみましたが、うまく動きません。

どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
...続きを読む

Aベストアンサー

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つの%に置き換えられます。

例)echo 10割は100%%
10割は100%


◆今回の場合

call set l=%%line:%mae%=%ato%%%
↓実行されるときに以下のように置き換えられます。
call set l=%line:abc=xyz%

置き換え後に call 文が実行されます。このcall文の記述だと set l=%line:abc=xyz% という1行のバッチを呼び出しているのと同等の動作になります。従って環境変数lineに入っている文字列のabcがxyzに置き換えられた結果が環境変数lに代入されます。
call文でワンクッション置いて、先に環境変数の mae と ato (と%%)だけ評価(環境変数の中身に置き換え)するようにしています。

◆単純に set l=%line:%mae%=%ato%% とした場合なぜうまくいかないか

set文の右辺の各要素を分けて書くと

%line:%(line: という環境変数の中身)→そんな変数は定義していないので空に置き換え

mae

%=%(= という環境変数の中身)→そんな変数は定義できないので空に置き換え

ato

%% → % に置き換え

と解釈されて
環境変数lには maeato% という文字列が代入されてしまいます。


余談ですがバッチ実行時にどのように置き換えられるか見たい場合は、
バッチ先頭のecho offの行を取って実行するとよく分かります。

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング