質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

解決済

4回答

1779閲覧

Windows10のコマンドプロンプト上でできるCSVファイルの結合および行先頭へのファイル名追加

majin

総合スコア11

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

0クリップ

投稿2018/11/09 04:17

編集2018/11/09 04:19

前提・実現したいこと

windows10のコマンドプロンプト上で実現可能な、
半角スペースを含むファイル名を持ったcsvファイルの結合(マージ)及び、
マージファイルの各先頭行にファイル名を出力したい。(可能なら拡張子抜きで)

非エンジニアの方が使用する前提でbatファイル化する想定です。
手前ではruby等で適当なscriptを書いて対応しているのですが、
毎回同じ依頼が来るため作業の簡略化したいです。

発生している問題・エラーメッセージ

実現したいことは下記質問とほぼ同じです。
『コマンドプロンプトでのCSVファイルの結合』
https://teratail.com/questions/138642#reply-209800

ほとんどのファイルは結合できたのですが、
今回対応するファイル群にはファイル名に半角スペースが入っているものがあり、
上記の質問上にて回答されていた方のソースコードでは対応できませんでした。
例:「転職 東京.csv」「ランチ 渋谷.csv」みたいな感じのファイルです。わかる方はわかるかもしれませんが、GRCという順位取得ツールの出力ファイルです。

該当のソースコード

Windows10 コマンドプロンプト

@echo off set OPT="tokens=*" ( for %%i in (*.csv) do call :SUB %%i )>result.csv.out pause goto :EOF :SUB echo %1>CON for /f %OPT% %%b in (%1) do echo %1,%%b set OPT="tokens=* skip=1" goto :EOF

追加補足

また、上記のコードだとファイル名がそのまま先頭行に入っているので、可能なら追記するファイル名の拡張子も削除した状態で出力したいです。

手前勝手な質問で申し訳ありませんが、お力添えいただけますとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

VBScript で作ってみました。
CSVファイルをスクリプトにドロップします。

Option Explicit Dim objF,args,i,outf,outp,outs,inp Set objF = CreateObject("Scripting.FileSystemObject") Set args = WScript.Arguments If args.count = 0 Then MsgBox "CSVファイルをドロップしてください。" WScript.Quit End If outf = objF.GetParentFolderName(args.item(0)) & "\hoge.csv" Set outp = objF.OpenTextFile(outf,2,True) For i = 0 To args.count - 1 Step 1 If Ucase(objF.GetExtensionName(args.item(i))) = "CSV" Then Set inp = objF.OpenTextFile(args.item(i),1) Do Until inp.AtEndOfStream outp.WriteLine objF.getBaseName(args.item(i)) & "," & inp.ReadLine Loop inp.Close Set inp = Nothing End If Next outp.Close Set outp = Nothing Set objF = Nothing MsgBox args.count & "ファイルを結合しました。"

スクリプト名は hogehoge.vbs みたいな感じで保存します。

投稿2018/11/09 06:46

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majin

2018/11/09 07:26

おお!ありがとうございます。 こちら問題なく動きました! VBScriptというものを初めて知りました。
guest

0

空白を含んだファイル名を対象にするのはめんどくさいので、必要の無いときは考えていませんでしたが、質問者以外が参照する事を考えると、考えて置いた方が良かったですね。
とはいえ、ファイル中の行頭に;があるケースとか考慮すると、どんなケースにも使えるスクリプトは無理なんですが。

引用符で囲んだファイル名を読むときはusebackqが必要です。

CMD

1@echo off 2set OPT="usebackq tokens=*" 3( 4for %%i in (*.csv) do call :SUB "%%i" 5)>result.csv.out 6pause 7goto :EOF 8 9:SUB 10echo FileLoad : %1 >CON 11for /f %OPT% %%b in (%1) do echo %~n1,%%b 12set OPT="usebackq tokens=* skip=1" 13goto :EOF

投稿2018/11/09 16:19

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majin

2018/11/12 00:23

返信遅くなりました! わざわざありがとうございます! こちら期待通りの動きになっております!
guest

0

こういう処理ならperlが圧倒的に楽なんですよね。

https://www.nkozawa.com/blog/archives/3935
こちらで紹介されているシステムを使うとperlスクリプトを簡単にexeファイル化できて、perlの知識皆無の人にも使ってもらうことができます。

rubyを使われているということですから、perlの敷居はそんなに高くないですよね。ひとつのオプションとして検討してはいかがでしょう。

perlスクリプトはこんな感じになります。

perl

1use strict; 2use File::Basename; 3 4# options 5my @files = <~*.csv>; 6my $outfile = "merged.txt"; 7 8open(my $fho, ">", $outfile) or die "Cannot open $outfile"; 9 10# header 11open(my $fhi, "<", $files[0]); 12$_ = <$fhi>; 13print {$fho} "filename\t", $_; 14close $fhi; 15 16# contents 17foreach my $file (@files){ 18 my $filename = fileparse($file, '..*$'); 19 open(my $fhi, "<", $file); 20 $_ = <$fhi>; # skip header 21 while(<$fhi>){ 22 print {$fho} "$filename\t", $_; 23 } 24} 25close $fho; 26

投稿2018/11/09 07:37

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majin

2018/11/09 07:56

ありがとうございます! Perlも多少は分かるので、こちら参考にさせていただきます。
guest

0

サブルーチンに渡す際に "" で囲ってあげましょう。
受け取る時に %~1 のように ~ つけるとダブルクォーテーションを取り除きます。
ファイル名から拡張子を取り除く場合は %~n1 のように ~n を付けます。

全体の処理がわからないので完動コードかはわかりませんが、以下参考になさってください。

bat

1@echo off 2set OPT="tokens=*" 3( 4for %%i in (*.csv) do call :SUB "%%i" 5)>result.csv.out 6pause 7goto :EOF 8 9:SUB 10echo "%~n1">CON 11for /f %OPT% %%b in ("%~1") do echo "%~1",%%b 12set OPT="tokens=* skip=1" 13goto :EOF

投稿2018/11/09 04:39

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majin

2018/11/09 06:10 編集

ありがとうございます! > 受け取る時に %~1 のように ~ つけるとダブルクォーテーションを取り除きます。 > ファイル名から拡張子を取り除く場合は %~n1 のように ~n を付けます。 大変勉強になりました。 頂いたソースを参考にごちゃごちゃ書き直してみたのですが、 半角スペースを含むファイルは処理が通りません。 ソース全体 ``` @echo off set OPT="tokens=*" ( for %%i in (*.csv) do ( call :SUB "%%i" ) )>result.csv.out pause goto :EOF :SUB echo FileLoad : "%~1">CON for /f %OPT% %%b in (%~1) do ( echo %~n1,%%b ) set OPT="tokens=* skip=1" goto :EOF ``` おそらくSUBのfor文のところでファイルを読み込めていないのだと思います。 ```for /f %OPT% %%b in (%~1)``` また、頂いたソースのようにSUBのfor文の箇所で読み込むファイル名を、 下記のように""で囲み、~で回避しようとすると ```for /f %OPT% %%b in ("%~1")``` %%bにファイル名が入ってしまうようで、 出力が「ファイル名,ファイル名.csv」となってしまいます。 加えて何故か半角スペースを含まないファイルは読み込まなくなります。 結合しようとしているファイルの例も下記においておきます。 ファイル名:「求人 名古屋.csv」 ``` 順位,Google タイトル,Google URL,Google スニペット 1,「求人 名古屋」で1位のサイト,http://1.com,サイトの説明 2,「求人 名古屋」で2位のサイト,http://2.com,サイトの説明 3,「求人 名古屋」で3位のサイト,http://3.com,サイトの説明 4,「求人 名古屋」で4位のサイト,http://4.com,サイトの説明 5,「求人 名古屋」で5位のサイト,http://5.com,サイトの説明 ``` ファイル名:「求人.csv」 ``` 順位,Google タイトル,Google URL,Google スニペット 1,「求人」で1位のサイト,http://1.com,サイトの説明 2,「求人」で2位のサイト,http://2.com,サイトの説明 3,「求人」で3位のサイト,http://3.com,サイトの説明 4,「求人」で4位のサイト,http://4.com,サイトの説明 5,「求人」で5位のサイト,http://5.com,サイトの説明 ``` ご助言いただけますと助かります。 ※もしかして返信に対する返信だと```表記とか使えない?
moonphase

2018/11/09 06:13

出力したいファイルは以下ですか? ファイル名,順位,Google タイトル,Google URL,Google スニペット 求人 名古屋.csv,1,「求人 名古屋」で1位のサイト,http://1.com,サイトの説明 求人 名古屋.csv,2,「求人 名古屋」で2位のサイト,http://2.com,サイトの説明 求人 名古屋.csv,3,「求人 名古屋」で3位のサイト,http://3.com,サイトの説明 求人 名古屋.csv,4,「求人 名古屋」で4位のサイト,http://4.com,サイトの説明 求人 名古屋.csv,5,「求人 名古屋」で5位のサイト,http://5.com,サイトの説明 求人.csv,1,「求人」で1位のサイト,http://1.com,サイトの説明 求人.csv,2,「求人」で2位のサイト,http://2.com,サイトの説明 求人.csv,3,「求人」で3位のサイト,http://3.com,サイトの説明 求人.csv,4,「求人」で4位のサイト,http://4.com,サイトの説明 求人.csv,5,「求人」で5位のサイト,http://5.com,サイトの説明
majin

2018/11/09 06:25

上記でも可ですが、可能なら下記のようにファイル名の拡張子は除きたいです。 ファイル名,順位,Google タイトル,Google URL,Google スニペット 求人 名古屋,1,「求人 名古屋」で1位のサイト,http://1.com,サイトの説明 求人 名古屋,2,「求人 名古屋」で2位のサイト,http://2.com,サイトの説明 求人 名古屋,3,「求人 名古屋」で3位のサイト,http://3.com,サイトの説明 求人 名古屋,4,「求人 名古屋」で4位のサイト,http://4.com,サイトの説明 求人 名古屋,5,「求人 名古屋」で5位のサイト,http://5.com,サイトの説明 求人,1,「求人」で1位のサイト,http://1.com,サイトの説明 求人,2,「求人」で2位のサイト,http://2.com,サイトの説明 求人,3,「求人」で3位のサイト,http://3.com,サイトの説明 求人,4,「求人」で4位のサイト,http://4.com,サイトの説明 求人,5,「求人」で5位のサイト,http://5.com,サイトの説明
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問