ファイル名,サイズ,Ver,タイムスタンプの順番で並んでいるcsvファイルがあります。

新旧二つのファイルを比較して双方の差分だけをテキストに出力したいと思います。(余計な物は混じっていないことが前提です。)
良いツールがあるページはありませんか?

なお、ファイル名だけで比較やサイズだけで比較ができるとなお良いです。
また、Windows限定でお願い致します。

よろしくお願い致します。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:inagaki_hisato No.1

回答回数884ベストアンサー獲得回数0

ポイント10pt

DOS窓やCMD、command.com を使いますが・・・ FCコマンドを使って比較できますね。

id:Maqusbayzen

FCですと不純物が混ざる(不一致行の前後の行とどのテキストを示しているのかを表す文字列)ので今回の件ですといまいち面倒です。それをきれいに整形する方法があれば別なのですが、まだ質問は続行します。よろしくお願い致します。

2006/01/08 03:34:24
id:masanobuyo No.2

回答回数4617ベストアンサー獲得回数78

ポイント20pt

http://www.microsoft.com/japan/windows/sfu/

Services for UNIX 3.5 ホーム

OS は Windows ですね!

それなら、Windows Services for UNIX か cygwin に含まれている diff コマンドが良いかも知れません。


参考URL: http://www.microsoft.com/japan/windows/sfu/ , http://cygwin.com/

id:Maqusbayzen

ありがとうございます。

Windows Services for UNIXはうまくインストールできませんでしたが、cygwinのほうはうまくいきました。diffではなく、commのほうが今回の目的には合致するようです。ただ、インストールから実施まで非常に時間がかかるので、もう少し回答をみて_たいと思います。ありがとうございました。

2006/01/08 07:56:33
id:inosisibeyan No.3

回答回数211ベストアンサー獲得回数0

ポイント10pt

「Rekisa」テキストの差分表示アプリケーションです。他のソフトとの連携が容易です。

id:Maqusbayzen

実はRekisaは使用してみたのですが、テキスト出力ができない(差分だけ出るわけではなく全てでてしまう。)ようです。また、画像出力もファイル数が多すぎるとうまく動かないようでした。引き続きテキスト出力ができるものを募集します。

2006/01/08 18:36:29
id:goldman No.4

回答回数86ベストアンサー獲得回数0

ポイント100pt

うちの社内では、上記のコマンドを使っています。

比較1ファイル名:file_a.csv

比較2ファイル名:file_b.csv

出力ファイル名:outfile.csv

ファイル名はカラム1

サイズはカラム2

VERはカラム3

タイムスタンプはカラム4

という条件で、

例1)ファイル比較で一致しないレコードを抽出する。(比較キーはファイル名とサイズ)

csvmat2 file_a.csv file_b.csv outfile.csv [(1)(2)][(1)(2)]

例2)ファイル比較で一致するレコードのみを抽出する。(比較キーはファイル名とサイズ)

csvmat file_a.csv file_b.csv outfile.csv [(1)(2)][(1)(2)]

例3)ファイル比較で一致しないレコードを抽出する。(比較キーはファイル名)

csvmat2 file_a.csv file_b.csv outfile.csv [(1)][(1)]

例4)ファイル比較で一致しないレコードを抽出する。(比較キーはサイズ)

csvmat2 file_a.csv file_b.csv outfile.csv [(2)][(2)]


※()内は比較キーとなるカラム番号

なお、キー項目はあらかじめソートされていること。

※CSVファイルのソートはSORTCSV.exeがあります。

項目1と項目2で昇順ソートする。

SORTCSV INPUT.CSV OUTPUT.CSV (1)(2)

id:Maqusbayzen

満点のご回答ありがとうございます。今から試験してみようと思います。ところで、goldman様上記のプログラムはどなたの作成したものなのでしょうか。アドレスから見るとVectorで配布されているもののようなのですが。はてな初心者でどうやって聞いたものかわからないので、このまま質問を少しの間だけ続けようと思います。できましたらおしえてください。

2006/01/09 02:56:11
id:banzo No.5

回答回数36ベストアンサー獲得回数0

ポイント100pt

(ツールは思いつかないもので)


私ならexcelでファイルAのデータ表の右にでも表のセル分=vlookup(左方のファイルAのセル,ファイルBの$範囲,1,0)をコピペして(最後は0だったか1だったか)

エラーの出なかった行を削除します。並び替えをしてエラー行を集めて残りをざっくり削除、ですかね。行の順番に意味があれば空いてる列に上から数字振っておいてざっくりやってからその数字の列で並べ替えします。

ファイルAとBを逆にしてやればもう一方も出ます。

どの列のエラーを見るかでファイル名だけの比較やサイズ比較もできるのではないでしょうか。

id:Maqusbayzen

なるほど、それもかなり早い手法ですね。皆さん色々な技術や発想を持っていてはてなで聞いて本当に良かったと思います。もう少しだけ様子をみさせてください。

2006/01/09 03:03:15
id:goldman No.6

回答回数86ベストアンサー獲得回数0

ポイント100pt

我が社で、契約している専属プログラマのかたが開発しています。(いずれも業務用コマンドなので1テラバイト、1兆件まで処理できるそうです)

今回のコマンドは、社内向けに作っていただいた専用のコマンドです。いいのかな公開しちゃって?。でも早いですよ。秒速で1千万件くらい処理しちゃいまから。

(プロテクトがかかっているなどなどのご質問はURLからできます)

id:Maqusbayzen

ぶっ、むちゃくちゃ凄いですね。この質問はここで終了させていただきます。

2006/01/09 03:16:23
  • id:goldman
    ゴールドマンです

    ひとつ、仕様を忘れてました。
    CSVMAT2は、ファイルAとファイルBを比較する場合は、ファイルAは、ファイルBの内容をすべて含んでいる必要があります。
    たとえば、1月5日のログファイルAと1月5、6日のログファイルBを比較する場合は、CSVMAT2 Bファイル Aファイル 出力ファイルというように指定しなければいけません。

    ※マッチング処理なので、ファイルAが終了した時点で処理は終了します。そのため大きいデータを保持するファイルを最初に指定してください。
  • id:Maqusbayzen
    ありがとうございます。

    ありがとうございます。
    >ファイルAは、ファイルBの内容をすべて含んでいる必要があります。
    ということはファイルAのみにある項目があるとまずいということなのでしょうか。書き忘れていて申し訳ないのですが、今回の件では双方のみの存在するものがあるはずなので、その辺は何とかクリアする必要がありそうですね。
    ただ、一致しているものがわかれば後は逆に何とかなりそうな気もします。
    もう少し頑張ってみようと思います。
    社内ソフトのようなのでこの作業終わったらきちんと削除させていただきますね。ありがとうございました。
  • id:Maqusbayzen
    Re:ありがとうございます。

    >>ファイルAは、ファイルBの内容をすべて含んでいる必要があります。
    ファイルAのみの差分を出す時
    ファイルB ファイルA+ファイルBをソートして重複行を削除したもの
    ファイルBのみの差分を出す時
    ファイルA ファイルA+ファイルBをソートして重複行を削除したもの

    上記で実行すればよいのでしょうか。
    色々試してみます。
  • id:goldman
    (投稿者削除)

  • id:goldman
    Re:ゴールドマンです

    >ひとつ、仕様を忘れてました。
    >CSVMAT2は、ファイルAとファイルBを比較する場合は、ファイルAは、ファイルBの内容をすべて含んでいる必要があります。
    >たとえば、1月5日のログファイルAと1月5、6日のログファイルBを比較する場合は、CSVMAT2 Bファイル Aファイル 出力ファイルというように指定しなければいけません。
    >
    >※マッチング処理なので、ファイルAが終了した時点で処理は終了します。そのため大きいデータを保持するファイルを最初に指定してください。
    >
  • id:Maqusbayzen
    Re:(投稿者削除)

    う、何か不都合などありましたでしょうか。
    即時削除のほうがよければそのように対応させていただきますのでご連絡下さい。
  • id:goldman
    Re(2):ゴールドマンです

    ええーと、表現がしにくいのですが、ファイルAをベースにデータを抽出します。
    つまり、ファイルAが100項目、ファイルBが50項目の異なるレイアウトのCSVである場合は、出力されるファイルOUTには、100項目のレイアウトを持つファイルAのレコードのみが出力されます。
    また、ファイルAに重複データがある場合は、自動的に重複レコードが1レコードにされます。したがって、出力されるファイルOUTには重複したファイルAのレコードは出力されない。という仕様たったはずです。
    ※余談ですが、CSVの重複レコード除去:CSVCMPコマンド、テキストの重複レコード除去:RECCMPコマンドとかもあります。
  • id:Maqusbayzen
    Re(3):ゴールドマンです

    なるほど、

     ファイルA+ファイルB ファイルB

    という比較をすれば
    ファイルAだけに含まれるものが

     ファイルA+ファイルB ファイルA

    という比較をすれば
    ファイルBだけに含まれるものが
    出ると考えれば良さそうですね。

    上記の考え方で宜しいでしょうか?
    色々説明させてすみません、別途ポイント送らせて貰いますね。

    あと、ソフト使用上の問題があればご連絡下さい。
    即時使用を中止します。(いずれにせよ作業終了時にはきちんと破棄します。)
  • id:Maqusbayzen
    Re(4):ゴールドマンです

    う、今試験してみたんですが、

    ファイルA
    1aaaa,bbbbb,ccccc,ddddd
    2aaaa,bbbbb,ccccc,ddddd
    3aaaa,bbbbb,ccccc,ddddd
    4aaaa,bbbbb,ccccc,ddddd

    ファイルB
    1aaaa,bbbbb,ccccc,ddddd
    2aaaa,bbbbb,ccccc,ddddd
    5aaaa,bbbbb,ccccc,ddddd
    6aaaa,bbbbb,ccccc,ddddd
    7aaaa,bbbbb,ccccc,ddddd

    という内容で、

    C:¥csvmat2 C:¥a.csv C:¥b.csv C:¥outfile.csv [(1)][(1)]
    上記コマンドラインで下記の結果(a.csvのみに含まれるファイル名)
    3aaaa,bbbbb,ccccc,ddddd
    4aaaa,bbbbb,ccccc,ddddd

    C:¥csvmat2 C:¥b.csv C:¥a.csv C:¥outfile2.csv [(1)][(1)]
    上記コマンドラインで下記の結果(b.csvのみに含まれるファイル名)
    5aaaa,bbbbb,ccccc,ddddd
    6aaaa,bbbbb,ccccc,ddddd
    7aaaa,bbbbb,ccccc,ddddd

    が出ました。どうやらあんまり気にせずに使って問題なさそうな気がします。
  • id:Maqusbayzen
    検証してみました。

    かなりいろいろレスつけて申し訳ありません。
    一応色々検証してみました。

    ・ソートはしてくれない模様です。(ソート行わないとチェックに洩れが出ます。)
    ・重複行も削除してくれません。(ある分だけ複数回出力されます。)
    ・ただし片方がもう片方を全て内包する必要は無いようです。(20vs60でも60vs20でも出力は正しく出るようです。)

    もし、不都合が無ければ重複行の削除プログラムもご案内いただけると嬉しいです。

    しかし、いろいろお世話になって本当にありがとうございました。
    今後ともよろしくお願い致します。
  • id:goldman
    Re:検証してみました。

    【CSVファイルのソート】

    SORTCSV 入力ソートファイル 出力ソートファイル (ソート対象項目番号)(ソート対象項目番号)・・・ [/R]

    ※/Rは降順指定 省略時は昇順となる。

    例) SORTIN.CSV の 1と3と5項目を昇順にソートし、SORTOUT.CSVに出力する。

       SORTCSV SORTIN.CSV SORTOUT.CSV (1)(3)(5)

    【CSVファイルの重複レコードの除去】

    CSVCMP 入力CSVファイル 出力CSVファイル (キー項目番号)(キー項目番号)・・・

    例) SORTIN.CSV の 1と3と5項目をキーにして重複行を削除して、SORTOUT.CSVに出力する。

       CSVCMP SORTIN.CSV SORTOUT.CSV (1)(3)(5)


    http://hp.vector.co.jp/authors/VA015622/csvcmp.exe
    http://hp.vector.co.jp/authors/VA015622/SORTCSV.exe

    からダウンロードできます。


  • id:goldman
    Re:検証してみました。

    >不都合が無ければ重複行の削除プログラムもご案内いただけると嬉しいです。

    【重要】
    CSVCMPで重複行を削除する場合は、必ずSORTCSVでソートしてから、CSVCMPを実行してください。
  • id:Maqusbayzen
    Re(2):検証してみました。

    色々ありがとうございました。
    最後にもう一度ポイント送らせていただきます。
    はてなの最初の質問が良い結果でとても良かったです。
  • id:goldman
    Re:ゴールドマンです

    ポイントありがとうございます。はてなは他の無料の質問サイトと異なりかなり的確な答えを得ることができますので、私も業務でかなり重宝しております。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません