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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

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

コマンドプロンプト

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

Q&A

解決済

2回答

11391閲覧

コマンドプロンプトでのCSVファイルの結合

Yoshitaka919

総合スコア9

CSV

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

コマンドプロンプト

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

0グッド

0クリップ

投稿2018/07/30 07:39

前提・実現したいこと

①CSVファイルの先頭列にファイル名が入力された列を追加したい
②①と同様のCSVファイルを最初のファイル以外の先頭行(項目ラベル)を削除して結合したい

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

現在コマンドプロンプトにて同型のCSVファイルの結合について苦戦しています。
下記のような売上明細のデータを分析したいのですが、何も考えずに一括で結合すると2ファイル名以降の項目ラベル(カテゴリ、担当、購入者)が分析の邪魔になり、かつどの商品のデータなのかがわからなくなってしまいます。

<ファイル>
ドライヤー_4月売上
テレビ_4月売上
ウォーターサーバー_4月売上
・・・
・・・
・・・
・・・

<ファイルの中身>
カテゴリ 担当者 購入者 購入日
家電   佐藤  田中  4/6    ←ファイル名がないので何の商品の売上なのかわからない
家電   佐藤  高橋  4/8
・    ・   ・   ・
・    ・   ・   ・
・    ・   ・   ・
カテゴリ 担当者 購入者 購入日 ←結合すると2ファイル目以降のラベルが分析の邪魔に。
キッチン 宮下  栗原  4/2
キッチン 宮下  桃井  4/11

<理想の状態>
ファイル名 カテゴリ 担当者 購入者 購入日
ドライヤー 家電   佐藤  田中  4/6    
ドライヤー 家電   佐藤  高橋  4/8
・    ・   ・   ・
・    ・   ・   ・
ドライヤー 家電   佐藤  高橋  4/8
ミキサー  キッチン 宮下  栗原  4/2   ←2ファイル目以降の項目ラベルを削除 
ミキサー  キッチン 宮下  桃井  4/11

ファイル名が全レコードに挿入

試したこと

別々の処理だったら可能なのですが、同時に処理を行うことができずに困っています。

<2ファイル目以降のヘッダー削除>

@echo off
setlocal enabledelayedexpansion

set /a counter=0

for /f %%i in ('dir /b *.csv') do (

echo %%i if !counter!==0 ( set /p _head=<%%i echo !_head!>>result.csv ) set /a counter=!counter!+1 for /f "tokens=* skip=1" %%b in (%%i) do ( echo %%b>>result.csv )

)
pause

<先頭列に結合前データ名を挿入>
@echo off

for %%F in (*.csv) do (

 for /f "delims=" %%L in (%%F) do (

  echo %%F,%%L

 )

)

補足情報(FW/ツールのバージョンなど)

win10を使用しています。
なにかあと少しでできそうな予感はあるのですが最後の一歩がうまくいかず大変悔しい思いをしています。どうかご協力をお願い致します。

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

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

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

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

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

guest

回答2

0

すべての CSV ファイルで、項目に違いはない、のですよね?

であれば、次のようにすればより単純になります。

1  最終出力結果に、「ヘッダ」を1行出力する
2  CSV ファイルそれぞれに対して、以下をくり返す
2-1 一行読み込む
2-2 先頭行(ヘッダ行)だったら捨てる
2-3 「ファイル名,」を最終出力結果に書き込む
2-4 2-1 で読み込んだ行の内容を書き込む(ここで改行が入る)

1ファイルめだったら、2ファイルめ以降だったら、と場合分けしようとするから苦労しているのだと思います。

投稿2018/07/30 08:05

tacsheaven

総合スコア13703

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

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

0

ベストアンサー

DOS

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 %1>CON 11for /f %OPT% %%b in (%1) do echo %1,%%b 12set OPT="tokens=* skip=1" 13goto :EOF

出力ファイル名の拡張子もCSVだと再実行したときに良くないです。

投稿2018/07/30 08:00

otn

総合スコア84499

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

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

Yoshitaka919

2018/07/30 08:08

otn様、一方的にではありますが、数々のアンサーをいつも大変参考にさせて頂いております、(上記コードもotn様のものを拝借したような記憶もあります)何もお返しできず恐縮ではありますが、今後とも何卒宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問