• ベストアンサー

CSVの空カラムの置換

空カラムに対して文字列を入れるバッチを作成したいのですがうまく動作いたしません。 下記のようなtest.csvがあります。 abc,12345 def, xyz,98765 2行目が空カラムになるためここに特定の文字列「¥-」を入れ 下記のようなCSVを生成したいです。 abc,12345 def,¥- xyz,98765 実際にはこれが数百行あり、いくつか空カラムがある想定です。 タスクスケジューラーで実施するため、簡単にbatファイルで出来ればと思っています。 ご教示いただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

「VBScript」で、プログラムを組みましたので、「.bat」の方で、「cscript Test.vbs」として、私のプログラムを呼び出してください(「.bat」と「.vbs」が同じフォルダにあれば、フォルダ指定は必要ないみたいです)。 以下のプログラムをメモ帳がテキストエディタに貼り付けて、「~.vbs」という名前で保存してください(上記の例では「Test.vbs」)。 「~.vbs」は、「Test.csv」と同じフォルダなければなりません。 Option Explicit Dim a, w, x, y, z Set w = CreateObject("Scripting.FileSystemObject") Set x = w.GetFolder(".") Set y = w.OpenTextFile(x & "\Test.csv",1, False, 0) Set z = w.OpenTextFile(x & "\Result.csv",2, True, 0) Do Until y.AtEndOfStream a = y.ReadLine a = Replace(a, ",,", ",\-,") If Left(a, 1) = "," Then a = "\-" & a End If If Right(a, 1) = "," Then a = a & "\-" End If z.WriteLine(a) Loop y.Close z.Close Set z = Nothing Set y = Nothing Set x = Nothing 簡単な説明です。 Set w = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしています。 Set x = w.GetFolder(".") プログラムファイル(「Test.vbs」)のあるフォルダを取得しています。 Set y = w.OpenTextFile(x & "\Test.csv",1, False, 0) 読み込み専用で、「Test.csv」ファイルを開いています。 Set z = w.OpenTextFile(x & "\Result.csv",2, True, 0) 書き込み専用で「Result.csv」を開いていて、存在しなければ新たに作成します。 Do Until y.AtEndOfStream 「Test.csv」ファイルが終わるまで処理します。 a = y.ReadLine 1行読み込み。 a = Replace(a, ",,", ",\-,") 「,,」があれば、「,¥-,」に置換。 If Left(a, 1) = "," Then a = "\-" & a End If 先頭が「,」なら「-¥,」に置換。 If Right(a, 1) = "," Then a = a & "\-" End If 最後の文字が「,」なら「,¥-」に置換。 z.WriteLine(a) 「Result.csv」ファイルに書き込んでいます。 あとは、終了処理です。

snin1107
質問者

お礼

丁寧に解説いただきましてありがとうございます!こちらの方法でも実装できたことが確認できました!

その他の回答 (2)

  • M_Sato
  • ベストアンサー率54% (550/1003)
回答No.3

sed.exe という、テキストファイルを1行ずつ読み込みながら処理するソフト(ストリーム・エディタといいます)を利用すれば、バッチで簡単に処理できます。 下記サイトから「Sed LOGOS版」をダウンロードし、解凍してください。使用するのはフォルダの中の sed.exe だけなので、これをデータと同じ場所にコピーしてください。 http://www.vector.co.jp/soft/dos/util/se000880.html 以下の内容のバッチ・ファイルを作成し、実行してください。 ----------------------------------------- del test.txt ren test.csv test.txt sed -e "s/,$/,\\-/" test.txt > test.csv ----------------------------------------- 元のtest.csvをtest.txtにリネームして保存し、変換後のデータをtest.csvとしています。 次回実行したときは、前回のtest.txtを削除します。

snin1107
質問者

お礼

なるほど、処理するソフトがあるのですね。ご教示いただいてありがとうございます!

  • FoolWord
  • ベストアンサー率73% (14/19)
回答No.1

各コマンドはヘルプを見て理解してください。 こんなバッチで空白を埋めることが出来ると思います。 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR /f "TOKENS=1,2* DELIMS=," %%i in (読込みファイル名) DO ( SET AA=%%i SET BB=%%j IF ""!BB!""=="""" ( ECHO !AA!,\- >> 出力ファイル名 ) ELSE ( ECHO !AA!,!BB! >> 出力ファイル名 ) ) ENDLOCAL

snin1107
質問者

お礼

いただいた内容で実装できました!ありがとうございます!

関連するQ&A

  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • バッチファイルでcsvファイルに追記していきたい

    C:\log\abc のディレクトリの中に、 log.csv log1.csv log2.csv log3.csv.... という複数のファイル(最終番号は絶えず変動する)があり、 それぞれは1行4カラム記載されています。 やりたいことは、バッチファイルにより log.csvのカラム内容 log1.csvのカラム内容 log2.csvのカラム内容 log3.csvのカラム内容 が最終番号のcsvファイルまで1つのlogR.csvに纏まることです。 下記のバッチファイルを組んでみたのですが、 C: CD \log\abc COPY log.csv logR.csv type log1.csv >> logR.csv type log2.csv >> logR.csv type log3.csv >> logR.csv これだと、追記が2行目3行目とならず、1行目の横にずっと広がって追記されてしまいます。 また、バッチファイルの指示が番号指示になってしまいますので、この指示番号から外れた ファイルがあった場合は、書き込みがされなくなります。 やりたいことは、 ●行として追記されること。 ●logの番号.csvを全て自動で読みだして追記することです。 http://okwave.jp/qa/q1371517.html の方法は試したのですが、どうもうまくいきませんでした。 お手数をおかけいたしますが宜しくお願い致します。

  • excel貼り付け用にcsv編集するには?

    vbでダブルクオートを含む文字列をcsv出力し、excelに貼り付けたいです。どうReplaceしたらよい?""Abc@def"@example.com"→""""Abc@def"@example.com

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

    いつもお世話になっております。 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文を使う使わないにはこだわりません。

  • 秀丸エディタで文字列の置換をしたい

    秀丸エディタの正規表現についてお教えください。 やりたいこと: 対象の文字列を含んでいない行を削除したい 例:defのみを削除したい abc def def abc ↓ abc abc どのようにすれば実現できますでしょうか? よろしくお願いします。

  • 置換をバッチファイルで実行

    あるテキストファイルの中の文字列例えば「ABC」を「DEF」に置換する操作をバッチファイルで実行するにはどうすれば良いのでしょうか?

  • [SQL Server] コマンドプロンプトからのCSV形式出力

    SQL ServerのテーブルデータをSELECTしてダブルコーテ区切りのCSVに出力したいと考えております。 ・batファイルからの起動を希望。 ・出力CSVファイル名はbatファイルより引数で指定したい。 ・出力後、DELETEも行いたい。 OracleだとSQL*Plus環境で下記のようにテキストレベルで簡単にできます。 SQL Serverでも同様のことができないでしょうか? 要は下記をSQL Server版でやりたいということです。 参考:Oracleだと・・・ 同一dirに、abc.batとabc.sqlを用意しabc.batを実行すると20070601.csvが生成される。 1.abc.bat rem ----abc.bat-ここから---- sqlplus usr/pwd@host @abc.sql 20070601.csv rem ----abc.bat-ここまで---- 2.abc.sql ----ファイル名=abc.sql-ここから--- set echo off set heading off SET VERIFY OFF set FEEDBACK OFF set TRIMSPOOL on set termout off set pagesize 0 set linesize 32767 spool &1 select '"'|| カラム1 ||'",'|| '"'|| カラム2 ||'",'|| '"'|| カラム3 ||'"' from テーブル1; spool off delete from テーブル1; exit ----ファイル名=abc.sql-ここまで--- 20070601.csv結果 -ファイル名=20070601.csv-ここから--- "20060726","scott","356160" "20060727","tiger","463391" "20060728","manager","1930" -ファイル名=20070601.csv-ここまで--- DBサーバ環境 OS:Win2003SvrR2 SQL Serverバージョン:わかりません。(2003にのってるので最近のだと思われます) Oracle経験者でSQLServer初心者です。マニュアルもなく、Web検索しても「SQL」「Server」ってなかなかうまくひっかからない!! ので質問あげさせていただきます。

  • CSVデータの文字列置換

    かなり、困っております・・・。 「c:\csv_data」に複数のcsvデータが入っており、csvに含まれている "00ABC"を"00000"に変換させたいです。 (フォルダ内の全てのcsvを変換させたいです) 一度作ってみたんですが、Excel-VBAでCSVファイルを開いて編集をかけると書式が失われてしまう為、だめでした・・・。 そこで ・Excel-VBAでの良い方法 ・BATファイルで拡張子csv⇒txtに開いてからの編集⇒csvへ といった2つの方法(どちらか)がであれば作業工程上、他の処理と同時に 自動化できることからこの2つの方法での文字列変換方法を知りたいです。

  • 文字列の検索 集計

    エクセルデータにて     A      B      C 1  ABC    ○○○    XYZ 2  ABC    ○○○    PQR 3  DEF    ×××    XYZ 4  DEF    ×××    PQR 5  DEF    ×××    HIJ *アルファベット、記号は文字列 において、下記形式にしたい場合はどの様な手法がありますでしょうか?     A      B      C 1  ABC    ○○○    XYZ PQR    2  DEF    ×××    XYZ PQR HIJ その際、Cに表示させる方法は、1)連続形式、2)カンマ区切り、3)別列の追加 が考えられると思いますが、どの形式でも構いません。(理想は2ですが) 初心者質問ですが、宜しくお願いします。

  • 長さ1の空文字列?

    タイトルの通り、長さ1の空文字列で困っています。 現在、Linux、Apache、MySQL、PHPを使って3階層アプリケーションを作っています。 予めMySQLでテーブルの形を決めておいて、CSVからデータを読み込ませておき、 PHPでSQL文を実行してレコードを取得することで、それらをユーザに表示という感じです。 複数あるカラムのうち、空文字列(CSV上でブランクだったもの)は表示させたくないので、 PHPで「 if(カラム=="")~ 」のように比較することで、空文字列だけ避けるつもりでした。 しかし上手くいかなかったので、strlen()で調べて見たところ、返り値が1でした。 本来は空文字列に対してstrlen()は0或いはfalseの返り値を返しますよね。 is_empty()でも空データ扱いにならず、当然NULLの扱いでもありません。 そのため、実データとの区別が出来ずに困っています。 何故、空文字列のカラムを除外したいかというと、 DB上のユニークなレコードを検索したいからです。 select * from where カラム='データ' and カラム='データ'… という風に。 「カラム=''」としてしまうと検索に引っかからなくなってしまいます。 どうすればよいでしょうか。 以下はそれぞれのバージョンです。 MySQL:5.0.95 PHP:5.1.6 Linux:RHEL5 Apache:2.2.3

    • ベストアンサー
    • PHP

専門家に質問してみよう