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

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

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

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

バッチファイル

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

文字コード

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

Q&A

解決済

2回答

14713閲覧

バッチファイルでCSVの文字コードを「Shift-JIS→UTF-8」に変換したい

KazukiNakata

総合スコア14

CSV

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

バッチファイル

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

文字コード

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

0グッド

3クリップ

投稿2019/01/30 03:57

編集2019/01/30 04:22

Dドライブ上にあるShift-JISで作られたdata1.csvをUTF-8に変換するバッチファイル(test.bat)を作成しましたが、実行して生成されたファイル(data2.csv)には何もテキストが入っていない空の状態になってしまいます。

ただし、生成されたdata2.csv自体は「UTF-8」への変換に成功しています。(テキストエディタで確認)
また、大元のdata1.csvには日本語を含んだ100行程度のデータが入っています。
バッチ初心者なのでテキスト内容のコピーを含めた変換方法をご教示いただけると幸いです。

以下がソース

@echo off

start /min /wait cmd /c chcp 65001 ^& cmd /c type d:¥data1.csv > d:¥data2.csv


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

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

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

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

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

maisumakun

2019/01/30 04:10

「何もテキストが入っていない空の状態」なのに「変換に成功」したと言える理由は何でしょうか。0バイトのファイルは、UTF-8でもシフトJISでもASCIIでも、全く同じファイルです。
KazukiNakata

2019/01/30 04:19

テキストエディタ(Mery)で「名前を付けて保存」画面を表示した時に表示されるエンコード「UTF-8」となっていたためそう判断しましたが、0バイトだと関係ないのですね。 すみません、私の勉強不足です。
guest

回答2

0

ベストアンサー

d:¥data2.csvが空なのは、> d:¥data2.csvが、startに対してのリダイレクトになっているからです。^> d:¥data2.csvとエスケープすれば、typeに対してのリダイレクトになります。

ただ、この方法でUTF-8にすることはできません。

BOM付きのUTF-8で良ければ、PowerShellを使って、

CMD

1powershell -Command "get-content data1.csv | Set-Content -Encoding UTF8 data2.csv"

BOM無しもがんばればできるようです。

投稿2019/01/30 05:13

otn

総合スコア84540

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

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

Zuishin

2019/01/30 06:00

補足ですが、PowerShell 6.0 では BOM 無し UTF-8 がデフォルトになりました。また -Encoding 引数が string 型から System.Text.Encoding 型に変わりました。 -Encoding UTF8 がどう解釈されるかは試していませんが、以前の文字列と同じ物は使えない場合があります。
otn

2019/01/30 06:26 編集

ああ、そうなんですね。ありがとうございます。上記は、Windows7での記述です。
KazukiNakata

2019/01/31 11:37

otn> ご指摘ありがとうございます。 また、記載いただいたPowerShellのコードが大変役に立ちました。 MYSQLに取り込む関係上、BOMなしUTF-8が理想でしたが、BOM付きでも取り込むことができました。BOM付きUTF-8だと1レコード目がMYSQL取り込み時に目的のフィールドではない箇所に入ってしまいますが、工夫次第でカバーできそうです。 今後BOMなしでできるかは自力で改変していきます。
KazukiNakata

2019/01/31 11:54 編集

>Zuishin 補足ありがとうございました。WindowsServer2012R2だったのでPowerShell 4.0でした。BOMなしデフォルトだと申し分ないので6.0へのバージョンアップも検討してみようと思います。
Zuishin

2019/01/31 12:00

未来の人のための補足だったんですが、PowerShell 6 は .NET Framework でなく .NET Core になり、使えなくなったコマンドレットやモジュール、パスの変更など色々と破壊的変更があるのでバージョンアップは慎重に行った方がいいかもしれません。 私は問題ないので移行しましたが、環境によってはかえって不便になる可能性もあります。
KazukiNakata

2019/01/31 14:18

>Zuishin ご意見ありがとうございます。職場にPowerShellの先駆者がいないため、ある意味バージョンアップのハードルは低いかもしれないです。あまり触れる機会がなかったので将来性を考えて勉強するとなると6.0も良いなと思いました。
guest

0

こんにちは。

下のコードで可能です(Win10にて確認)。
使い方などは参考サイトをご覧ください。

dos

1@echo off 2:Shift_JIS -> UTF-8 3setlocal enabledelayedexpansion 4for %%f in (%*) do ( 5 echo %%~ff| findstr /l /e /i ".txt .csv" 6 if !ERRORLEVEL! equ 0 ( 7 powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0], [Text.Encoding]::GetEncoding(932)))}" \"%%~ff\" \"%%~ff.utf8%%~xf\" 8 ) 9)

参考:シフトJISのテキストファイルをUTF-8に変換するバッチ - 今日を乗り切るExcel研究所

投稿2019/01/30 04:53

firedfly

総合スコア1131

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

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

KazukiNakata

2019/01/31 11:26

ありがとうございます。参考にしていたサイトでしたが、バッチファイルに対して目的のテキストファイルをドロップする仕様であったため目的に合わず断念しました。 説明不足でしたがタスクスケジューラでCSVファイルのエンコード変換後にMYSQLへ取り込む予定でいました。
Stan_Dma

2019/01/31 11:33 編集

You may as well use nkf.exe or ack.exe to convert character encodings, which can get from somewhere but I am sorry I don't know where it is.
firedfly

2019/01/31 11:58

最初からそう言ってもらえれば、引数を渡して実行できるように改造しましたが……。まあ、もういいですかね。
KazukiNakata

2019/01/31 14:05 編集

>Stan_Dma Thank you for your comments. I examined nkf.exe, but As much as possible,I want to correspond only with standard functions.so I gave up.
KazukiNakata

2019/01/31 12:23 編集

>firedfly そうですね、、、説明不足でした。 もし差支えなければ、私のスキル不足のためぜひ勉強させていただけないでしょうか。
firedfly

2019/01/31 13:08

上のコードはこのままでもコマンドラインからの引数指定で動きます。 バッチファイルにドラッグ&ドロップすると 引数としてファイルパスが渡されて実行されるだけで特別な対応はいりません。 %* を使えば任意の個数の引数(つまり複数ファイルのドロップ)に対応できて便利です。
KazukiNakata

2019/01/31 13:33 編集

>firedfly 思った通りの動きになりました、ありがとうございます。(BOMなしUTF-8なので私の一番求めてた処理です) なぜドラッグ&ドロップしたら変換されるのかが分からず、指摘いただくまで単純なことに気づけませんでした… もう少し応用が効けるようにMS-DOSの基礎を深めようと思います
firedfly

2019/01/31 13:41

ようございました。 ただもうDOSは使わなくていい気もしますが……。
KazukiNakata

2019/01/31 14:26

>firedfly やはりDOSの将来性は低いのですかね…未だにWindowsの単純なルーチン作業はバッチ処理に頼ってしまいます。
firedfly

2019/01/31 14:30

単純ならDOSでいいですが、少しでも複雑だと……。 LinuxやMacならPythonが、WindowsならPowerShellが標準でありますからね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問