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

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

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

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

ファイル

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

11127閲覧

バッチファイルでcsvファイルの「,」で区切られた文字列を抽出したい

alfald

総合スコア19

CSV

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

ファイル

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

1クリップ

投稿2020/10/30 01:10

編集2020/10/30 01:20

前提・実現したいこと

csvファイルの特定の列の文字列を抽出したい。

その列には,区切りを含む文字列が存在する。

該当のソースコード

FOR /F "tokens=3* delims=^," %%a in (test.csv) do echo %%a %%b %%c %%d %%e %%f >> テーブル名.csv

試したこと

,区切りのため特定列以降をすべて取ってくるコードを作成したが、%%a~%%fまで記述したが、出力結果には使われなかった%%e~%%fも表示された。
これの表示をなくしたい。

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

使用しているcsvファイルの中身は以下の通りです。

番号,かな,テーブル名
試作000001,かきくけこ,"aaaa,bbbb"
試作000002,さしすせそ,"aaaa,bbbb"
試作000003,なにぬねの,"aaaa,bbbb,dddd"
試作000004,たちつてと,"cccc,bbbb,rrrr,aaaa"

テーブル名は増える可能性がある。

出力結果はすべて,で区切られていることが望ましい

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

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

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

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

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

guest

回答2

0

いろいろ試している間に回答終わってたわ。

バッチファイルによる出力は、すでにあった回答とほとんど同じ。%%~bとすることで二重引用符が取れるので、そのままCSVファイルとして読み込めるはず。skip=1で1行目を読み飛ばす。

for /f "tokens=2* skip=1 delims=," %%a in (test.csv) do echo %%~b >> テーブル名.csv

テーブル名の後にカラムが追加された際に、テーブル名だけを抽出する方法

そこまで来たら、もうバッチファイルではなく、スクリプト系言語に任せた方がいい。たとえば、Pythonなら以下のように書ける(読み書きするファイルのエンコーディングによっては、各メソッドの引数にencoding=...の追加指定が必要)。

Python

1import pandas as pd 2 3df = pd.read_csv("test.csv") 4df.to_csv("テーブル名.csv", mode="a", columns=['テーブル名'], sep='\t', header=None, index=None)

投稿2020/10/30 02:28

編集2020/10/30 02:30
Daregada

総合スコア11990

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

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

alfald

2020/10/30 02:42

回答ありがとうございます。 ~をつけることによって二重引用符が取れるのですね。 set a=%%b echo !a:"=! という形でやっていたので助かりました。 やはりバッチファイルでは限界があるのですね。 参考にさせていただきます。
Daregada

2020/10/30 02:48

今回のバッチファイルによる回答は、「tokens=2*」を指定して3列目以降を連結することで、「""内の,は無視する(区切り文字としない)」というルールに対応できないfor /fのトークン分解処理の問題を回避しているから、さらに列が追加されると(それも連結対象となってしまい)うまく処理できなくなります。
alfald

2020/10/30 02:56

知識不足ですみません。 そのような理由があるのですね。 いろいろありがとうございます。
guest

0

ベストアンサー

tokens=3*だと、
%%a・・・第3列
%%b・・・第4列以降を連結した物
%%c・・・未定義
%%d・・・未定義。以下同様
です。

テーブル名だけをそのまま取りたいなら、tokens=2*にすると%%bがテーブル名全体になります。

投稿2020/10/30 01:43

otn

総合スコア85901

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

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

alfald

2020/10/30 01:59

echo %%b とすることでできました。 ありがとうございます。
alfald

2020/10/30 02:01

もしもなのですが、テーブル名の後にカラムが追加された際に、テーブル名だけを抽出する方法はありますか?
otn

2020/10/30 02:43

試作000004,たちつてと,"cccc,bbbb,rrrr,aaaa",2020-10-30,xxxxx みたいな感じですかね。 引用符がテーブル名以前にないのであれば、引用符をdelimsにして、tokes=2を取れば良いかと。 ただし、引用符の中ではエスケープの^が効かないので、オプションを引用符で囲まず、イコールや空白を個別にエスケープします。 FOR /F tokens^=2^ delims^=^" %%a in (test.csv) do echo "%%a" 一般的にCSVを扱うなら、PowerShellでしょうか。
alfald

2020/10/30 02:54

そのような考え方があったのですね。 引用符にはあまり注目していませんでした。 ありがとうございます。 csvでpowershellコマンドは今のところエンコーディングでしか使用していません。 csvファイルの文字列や値をバッチファイルで変数に代入する形で主に使用しています。 バッチファイルの実行はコマンドプロンプトで行っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問