• 締切済み

【windowsバッチ】CSVの編集

とあるCSVファイル(先頭行はヘッダー項目)において、個人コード(先頭列)に文字列を含むレコードを除外したいです。 (個人コードに文字列を含まないレコードを読み込んで、新たにCSVファイルを作成でも可) 出来ればVBS等は用いず、バッチのみで行いたいのですが… 恐れいりますが、どなたかご教示いただけますでしょうか。 よろしくお願いいたします。

みんなの回答

noname#223623
noname#223623
回答No.4

> 恐れいりますが、コマンド出力結果をCSVファイルにする実装例もご教示いただけますでしょうか… 先の回答にも書いたけど、ファイルにリダイレクトでいいんじゃないか。 C:\XXX>findstr "^[^a-z"] sample.csv > out.csv これまでの質問文や補足などからは、バッチファイルでやる理由が読み取れない。

uma-taro
質問者

お礼

masa_peeさま 既存のバッチファイル内にその処理を追加したかったためです。 言葉不足で申し訳ございません。 なお、お陰様で改修、テスト共に無事完了しました。 この度は丁寧にご教示してくださり、本当にありがとうございました。

noname#223623
noname#223623
回答No.3

> 大変恐縮ですが、実装例をご教示いただけますでしょうか… 了解です。コマンドの実行例だけ書きます。バッチファイルにする必要があるのかな? まずはサンプルの CSV ファイル。次のファイルを処理する。C:\XXX は適当なディレクトリに読み替えてください。  C:\XXX>type sample.csv  12345678,foo  a2345678,bar  123b5678,baz  87654321,ほげ  c7654321,piyo 最初は、「a~z が含まれる行」を出力してみる。  C:\XXX>findstr "[a-z"] sample.csv  12345678,foo  a2345678,bar  123b5678,baz  c7654321,piyo オプション /B を付けると、「行頭が a~z で始まる行」のみ出力できる。  C:\XXX>findstr /B "[a-z"] sample.csv  a2345678,bar  c7654321,piyo さらにオプション -V を付けて結果を反転。つまり「「行頭が a~z ではない行」のみ出力できる。  C:\XXX>findstr /B /V "[a-z"] sample.csv  12345678,foo  123b5678,baz  87654321,ほげ オプションを使わないで、正規表現だけでやるならこう。  C:\XXX>findstr "^[^a-z"] sample.csv  12345678,foo  123b5678,baz  87654321,ほげ あとはファイルにリダイレクトするなりご自由にどうぞ。

uma-taro
質問者

お礼

masa_peeさま ご教示本当にありがとうございます。 それでなんですが… 恐れいりますが、コマンド出力結果をCSVファイルにする実装例もご教示いただけますでしょうか… (対象行出力→CSVファイル生成までをバッチファイルにした実装例ですと非常に助かります) 実は別途やらなければならない作業があり、本件について調べている余裕がなかなかなくて… 度々お手数おかけして本当申し訳ございません。 何卒よろしくお願いいたします。

noname#223623
noname#223623
回答No.2

> 個人コードの先頭にアルファベット(a~z)を含むレコードを除外したいです。 要するに、「行の先頭が a~z ではない行のみ出力する」でいいんだろうか。だったら、findstr で簡単にできる。ただし、Windows のバージョンによっては使えない、あるいは挙動が異なるかもしれない。 findstr の説明は以下を参照。  findstr - 文字列や正規表現を使って文字列を検索する  http://www.k-tanaka.net/cmd/findstr.php 実行例が必要ならリクエストください。

uma-taro
質問者

お礼

masa_peeさま 夜分に失礼します。 ご教示ありがとうございます。 〉要するに、「行の先頭が a~z ではない行のみ出力する」でいいんだろうか。 ご認識のとおりです。 a.csvの2行目以降(1行目は項目名ヘッダー)を、各行の先頭がa~zではない行のみの形にして出力したいです。 大変恐縮ですが、実装例をご教示いただけますでしょうか… お手数おかけしますが、何卒よろしくお願いいたします。

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.1

ストリーム操作なんだからawkの出番ですね。 dos用にgawkというのが出回っていますのでそれを使ってください。 バッチでつくるというかシェルで組むわけです。

uma-taro
質問者

お礼

hue2011さま ご教示ありがとうございます。 すいません、障害対応なんですが、今の客先ですぐにそれを取り入れるのは困難です。。 バッチのみで実装したいと書きましたが、やはりVBSで実装して、それをバッチ側で呼び出すのが一番無難な気がしています。。 ただ…VBSでの実装方法がよくわかりません… わざわざ回答してくださったのに申し訳ございません。

uma-taro
質問者

補足

個人コード(先頭列)に含まれる文字列についての詳細が判明しましたので補足します。 個人コードの先頭にアルファベット(a~z)を含むレコードを除外したいです。 何卒よろしくお願いいたします。

関連するQ&A

  • Windowsバッチで「,,,,,,,,,,」削除

    CSVファイルがあります。Windowsバッチを使って、 CSVファイルの中に「,,,,,,,,,,」という行があったら この行を削除して上書き or 別名で保存したいのですが、 どのようなコードになりますか? for でdelimsなしで1行ずつ読み込み、 「=,,,,,,,,,,」で処理を分岐させようとしたら うまくいきませんでした。

  • UTF-8にエンコードされたCSVファイルをメモ帳で編集

    UTF-8にエンコードされたCSVファイルをメモ帳で編集しても文字コードはそのままなのでしょうか? 上記UTF-8コードCSVファイルをメモ帳で見ると、ちゃんと文字コード変換されてきれいに見えます。 編集作業として、レコード(行)の削除のみです。 よろしくお願いいたします。

  • CSVファイルのバッチまたはVBでの編集

    バッチおよびVBのドがつくほどの初心者です。 環境:Windows7 Pro 下記のような行が数百行ほど記載されているCSVファイル(xyz.csv)があります。 "(桁数不定の変数a)-(1桁の変数b)(1桁の変数c)","yyyymm" これをバッチまたはVBにて (1桁の変数b),(桁数不定の変数a),(1桁の変数c),yyyymm に自動的に変更したいと考えています。 例 "1234567890-12","201409" ↓ 1,1234567890,2,201409 「-」を「,」に変更したり「"」の削除、また桁数が不定でなければ指定の位置に「,」を入れることは出来そうなのですが 桁数が不定ということで、行き詰ってしまいました。 システム上 "(a)-(b)(c)","yyyymm"を "(a)-(b)(c)","(a)-(b)(c)","(a)-(b)(c)","yyyymm" に変更することは出来そうなので、先頭から検索して「-」の個数と位置で指定の文字列を消すという方法もあるのかなと思ったのですが こちらについてもやり方がまったくわからなくお手上げ状態になってしまいました。 (桁数固定なら、こちらで指定の位置だけ削除できればと思っていたのですが……) 上記処理を行えるバッチまたはVBで編集するコマンドをご教示いただければと思います。 ご回答お願いいたします。

  • VBSとCSVによるテキストデータの操作について

    識者の皆様、いつも参考にさせていただきありがとうございます。 VBSによるテキストファイルの操作についてお伺いします。 ファイルAにCSVのヘッダー行があり、ファイルBにCSVヘッダーとデータがあります。ファイルBにあるヘッダーはファイルAのヘッダーと部分で一致します。このとき出力先ファイルCで、ファイルAのヘッダーを持ち、ファイルBのデータを一致するデータ列にもったCSVを作成したいです。 具体例を出すと、  ファイルAは1行目に Header1,Header2,Header3,Header4,Header5 のヘッダーのみをもちます。 ファイルBの1行目  Header1, Header4,Header5 ファイルBの2行目 ABC,DEF,GHI のように、一部のヘッダーとそれに対応するデータがあります。 VBSで処理後の出力先ファイルCは ファイルCは1行目に Header1,Header2,Header3,Header4,Header5 ファイルCは2行目に ABC,,,DEF,GHI のようにしたいです。 VBSで例示などいただけると幸いでございます。

  • CSVファイルをインポートさせたい

    先頭行がフィールド名をあらわしたCSVファイルがあるのですが、これをOracle10gXEにインポートさせるにはどうしたらよいのでしょうか? 文字コードも気にする必要がありますか?現在SJISファイルのCSVファイルがあります。

  • バッチファイルで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 の方法は試したのですが、どうもうまくいきませんでした。 お手数をおかけいたしますが宜しくお願い致します。

  • vbs csv 編集

    vbsを実行し下記のようにcsvを編集することは可能でしょうか。 ドラッグアンドロップでvbsを実行することとします。 <実行前> A列 B列  C列 名前 性別 出身地 田中 男  北海道 佐藤 女  沖縄 伊藤 女  東京 桜井 男  東京 <実行後> A列 B列  C列  D列   E列 田中 男  北海道 000001 学生 佐藤 女  沖縄  000002 学生 伊藤 女  東京 100000 社会人 桜井 男  東京  100001 社会人 編集箇所としては、 ・一行目を削除し、二行目を先頭にする。 ・D列には000001~999999まで連番で値を追加 ・E列には、D列の値が「~99999」の場合は、学生。  それ以上は、社会人と記載するようにする。 宜しくお願いします。

  • バッチで118項目のCSVを処理したいですが。。。

    バッチファイルで一行に、118項目のあるCSVファイルを読み込んで、必要な項目を抽出して、新しいCSVを作りたいです。 いろいろ調べたら for /f "delims=, tokens=1-3" %%I in (sample.csv) do ( echo %%I %%J %%K>> new.csv ) で実現できると思っていましたが、tokensに値の制限があって、tokens=1-118にすると、うまくいかないです。 どなたかいい方法をご存知でしたら、教えていただきたいですが。

  • CSVの項目検索について

    現在C++を使いはじめて1週間になり、そこで任されたプログラムの一部がわからずに困っています。 概要: ・CSVファイルがありそこの、ある項目列と検索する文字列が一致すれば、一致したレコードを取得するといった部分で煮詰まっています・・・ CSVファイルのサンプル testA,1,200412 testB,2,200410 testC,3,200409 といった感じで、「testA」といった文字列で検索をかけ「testA,1,200412」といったようにその対象となるレコードを取得したいのです。 今はWinAPIを使って作成すると言ったことから CreateFileなどの関数でCSVを読み込むところまで出来ましたが、要領がわからず調べても要領がわからずに1日無駄にすごしてしまいました、そこで どなたかアドバイスをもらえればと思い質問いたしました。 環境はVC++6.0です、よろしくお願いします。

  • バッチえファイルを編集するには??

    こんばんは。 初めて掲載します。 バッチファイルで、複数のあるファイルの中身の特定の文字列を一括編集したと思っているのですが、どのようにコマンドを組めばいいのでしょうか? コマンド、バッチは初めてなのでどのように組めばいいのか是非ともご教授願います。 例として、バッチを実行すると、 C:\temp\の下にtest1.xmlとtest2.xmlがあります。 バッチファイルを実行すると、その2つのファイルの中身のある特定の文字を編集("AAA"という文字列を"BBB"に)して保存する。 というような処理を行いたいです。