UwView シリーズ — 探す UwView・比べる UwDiff
2つのファイル・フォルダを比べるのは UwDiff、巨大なファイルを開いて探すのは UwView。どちらも Windows・macOS・Linux で動きます。→ UwView の操作ガイド(画面)・UwView のuvf コマンド操作マニュアル
UwDiff 操作マニュアル(1.0.0)
このページは GitHub の 操作マニュアル(docs/manual.ja.md) と同じ内容です。版が上がったときは GitHub の方が先に新しくなります。
[UwDiff のトップへ]
UwDiff は、2 つのファイル(または 2 つのフォルダ)を比べて、どこが違うかを出す道具です。
形式(テキスト・CSV・TSV・圧縮ファイル・Word・Excel・PDF)、文字コード(UTF-8・Shift-JIS〔CP932〕・EUC-JP・UTF-16)、
大きさ(1 本 10GB 級)、本数(数千〜数万本のフォルダ)を問いません。画面(UwDiff)と CLI(uvd)が同じ比べ方をします。
1. 入れ方
| OS | 配布物 | 入れ方 |
|---|---|---|
| macOS(Apple Silicon・Intel) | UwDiff-<版>-mac-<arm64 か x64>.dmg |
開いて UwDiff を Applications へドラッグ。CLI は UwDiff.app/Contents/MacOS/uvd |
| Linux(x86_64・aarch64) | UwDiff-<版>-linux-<arch>.tar.gz |
好きな所に展開。UwDiff(画面)と uvd(CLI)が並ぶ |
| Windows(x64・ARM64) | UwDiff-<版>-win-<arch>.zip |
好きな所に展開。UwDiff.exe と uvd.exe が並ぶ |
.NET を別に入れる必要はありません。CLI をどこからでも使うには、uvd のある場所を PATH に足すか、リンクを置きます
(mac の例: ln -s /Applications/UwDiff.app/Contents/MacOS/uvd /usr/local/bin/uvd)。
2. 画面(UwDiff)
- 「旧」「新」にファイルかフォルダを入れる(「ファイル…」「フォルダ…」で選ぶか、窓へ落とす。2 つ一緒に落とすと旧・新に入る)。
- 比べ方を選ぶ。
- キー列を入れると表(CSV・TSV・Excel)として照合する(例
点名、複数なら点名,種別)。空ならテキストとして比べる。 - 「空白の量を無視」「空白をすべて無視」「大文字・小文字を無視」はテキストの比較で効く。
- 「順番を問わない」は行の順番を見ずに、どの行が増えた・減ったかだけを比べる。
- 旧・新がどちらもフォルダのときは、旧の行の右の「含める」、新の行の右の「除く」に指定を入れられる(例
**/*.csv,**/*.log・.git,*.tmp。CLI の-include・-excludeと同じで、書き方は UwView の uvf と同じ。3-5 を参照)。ファイルのときは入力できない。 - 「比べる」。結果はタブで開く(いくつでも並べられる。× で閉じる)。
メニュー・言語・コマンドライン
- メニューは mac ではメニューバー(UwDiff・ファイル・ヘルプ)、Windows・Linux では窓の上(設定と「UwDiff について」はファイル・ヘルプの中)。
- UwDiff: UwDiff について(版・ビルド番号)/設定…(⌘,)
- ファイル: 旧を開く…(⌘O)/新を開く…/比べる(⌘Enter)/コマンドライン…(⇧⌘K)/結果を開く…(
uvd -result・-openが書いたフォルダ)/閉じる(⌘W)/すべて閉じる - ヘルプ: 使い方/最新情報/お問い合わせ/GitHub/コマンドライン設定…
- 言語: 「設定…」で日本語・英語を切り替える(開いているタブもその場で替わる。選んだ言語は覚えておく。初めは OS の言語)。CLI の出力は日本語のまま。
- コマンドライン…:
uvdの引数を打って実行する。比べた結果は新しいタブで開く(uvd … -openと同じ)。 - コマンドライン設定…: ターミナルで
uvdと打つだけで使えるようにする(mac・Linux は/usr/local/bin/uvdのリンク、Windows はユーザーの PATH)。 - ボタンや欄にマウスを置くと、説明(ツールチップ)が出る。
テキストの結果
- 左に旧、右に新。消えた行は赤、増えた行は緑。変わった行は左右に並び、変わった文字を濃く塗る。
- 「変更の所だけ」を入れると、同じ行が続く所を前後 3 行だけ残して畳む(外すと全部の行)。
- 「◀ 前の変更」「次の変更 ▶」(F7・Shift+F7)で変更の所へ飛ぶ。
- 10GB のファイルでも、画面に出ている行だけを読むので軽い。
表の結果
- 差分を 1 行ずつ(区分・キー・列・旧値・新値)。追加は緑、削除は赤、変更は黄。
- 「区分」で絞る。「キー・値で探す」に文字を入れて Enter で探す。
- 採る変更を選んで反映する: 採らない行のチェックを外し(「すべて採る」「すべて外す」もある)、「採った変更を反映…」で保存先を選ぶ。
旧のファイルに、採った変更だけを当てた新しいファイルを書く(元のファイルは変えない。旧の文字コード・区切り・改行・引用符・行の順番を保つ)。
Excel のシートの照合と「順番を問わない」比較は、差分の一覧まで(反映はしない)。
フォルダの結果
- 旧だけ(赤)・新だけ(緑)・違う(黄)・同じ の一覧。「区分」で絞る(既定は違いだけ)。
- 「違う」の行をダブルクリックすると、その 1 組を新しいタブで比べる(キー列が入っていて CSV なら表として)。
3. CLI(uvd)
uvd 旧 新 [-o 差分] テキストの比較(unified diff)
uvd 旧 新 -key 列名 [-o 差分.csv] 表をキー列で照合する
uvd 旧 新 -unordered [-o 差分.csv] 行の順番を問わずに比べる
uvd 旧フォルダ 新フォルダ [-o 一覧.csv] フォルダどうしを比べる
uvd apply 旧 新 差分.csv -o 結果 表の差分(採る行だけ残したもの)を旧に反映する
uvd … -open 結果を画面で開く(画面はもう一度比べない)
uvd -open 画面を開く
uvd -h オプションの一覧
終了コードは diff と同じ: 0 = 同じ、1 = 違いあり、2 = エラー(uvd apply は 0 = すべて反映、1 = 反映しなかったものがある)。
3-1. テキストの比較
uvd 旧.log 新.log -o 差分.diff
uvd 旧.log.gz 新.log.zst -o - (圧縮のまま。-o - で標準出力へ)
uvd 仕様_v1.docx 仕様_v2.docx -o 差分.diff
- 出力は
diff -uと同じ形(patchで旧に当てると新になる)。前後の行数は-U 行数(既定 3)。 -b(空白の量の違いを無視)・-w(空白をすべて無視)・-i(英字の大文字・小文字を区別しない)。- 改行コード(\r\n と \n)の違いは既定で無視する。違いとみなすなら
-strict-eol。ファイルの最後に改行が無いことは違いとして出す。 - 巨大なファイルでも、違いの所の前後だけを持って 1 回読みで比べる。1 か所で数百万行が入れ替わるような所は、その範囲を「置き換え」として出すことがある(正しい差分だが、最小とは限らない)。
3-2. 表の比較(キー照合)
uvd 旧.csv 新.csv -key 点名 -o 差分.csv
uvd 旧.csv 新.tsv -key 点名,種別 -o 差分.csv
uvd 台帳_9月.xlsx 台帳_10月.xlsx -key 点名 -o 差分.csv
- 出力は
区分,キー列…,列,旧値,新値(UTF-8)。区分は 追加・削除・変更(変わったセルごとに 1 行)。Excel のときは区分の次に「シート」の列。 - 行の順番が違ってもキーで対応付ける。列は見出しの名前で対応付ける(並びが違ってもよい)。旧だけ・新だけの列は、相手を空として比べる。
- キーは見出しの名前か
#1のような列番号。複数列の組み合わせもよい。キーが重複している値の数を出す(-nodupで数えない)。 - 値は文字列のまま比べる(先頭の 0・長い数字・日付らしい値を変えない)。Excel は表示されている値で比べる(元の値なら
-raw)。 - 区切りは
.tsv・.tabはタブ、.csvはカンマ、ほかは見出しの行から決める(-d tabなどで固定)。引用符を使わない TSV は-quote off。 - メモリ: 相手がまだ来ていない行(待ち行)が
-mem(既定は実メモリの 4 割)を超えたら一時ファイル(-tmp、既定は OS の一時フォルダ)へ逃がして続ける。止まらないが遅くなる。
3-3. 採った変更の反映(apply)
- 照合する:
uvd 旧.csv 新.csv -key 点名 -o 差分.csv - 差分.csv から採らない行を消す(Excel で開いて行を消して保存してもよい。CP932・タブ区切り・UTF-16 で保存し直したものも読む)。
-
反映する:
uvd apply 旧.csv 新.csv 差分.csv -o 結果.csv -
削除: そのキーの行を書かない。変更: そのセルだけを新値にする。追加: 新からその行を取り、旧の列の並びに直して末尾に足す。
- 旧の文字コード・BOM・区切り・改行・引用符・行の順番を保つ。変えない行はバイト単位でそのまま。
- 旧の今の値が差分の旧値と違うセル、新値が旧の文字コードで書けない値、見つからないキー、旧に無い列への変更は、当てずに知らせる(終了コード 1)。
3-4. 順番を問わない比較
uvd 旧.log 新.log -unordered -o 差分.csv — 行全体を 1 つの値とみなし、同じ行が何回あるかまで比べる(旧に 3 回・新に 2 回なら 1 回の削除)。空の行は数えない。
3-5. フォルダの比較
uvd 納品_前回/ 納品_今回/ -o 一覧.csv
uvd 旧/ 新/ -include "**/*.{csv,log}" -exclude ".git,*.tmp" -detail 差分たち/ -key 点名
uvd 旧/ 新/ --ignore-file 除外.txt
- 含める(
-include)は UwView の uvf のファイルの指定と同じ書き方: - 区切りはカンマ(名前に空白を含むならカンマで)。カンマが無ければ空白・タブ。
;もカンマと同じに扱う。 *・?はフォルダの区切りをまたがない。**はフォルダを何段でも(0 段も)。{a,b}は「a か b」(例*.{csv,log})。[ ]は使えない。- 旧・新それぞれのフォルダから見たパスに当てる:
*.csvは直下だけ、**/*.csvは下の階層も、sub/**は sub の下すべて。空ならすべて。 - 除く(
-exclude)は uvf の除外(--ignore-file)と同じ .gitignore の書き方(区切りは含めると同じで、1 つずつが 1 行): /が無ければどの深さの名前にも当たる(.git・*.tmp)。末尾の/はフォルダだけ(build/)。先頭の/は直下から(/sub/deep)。!で取り消し(*.csv,!a.csvは a.csv だけ残す)。フォルダに当たれば、その下をすべて除く。--ignore-file ファイルで、.gitignore と同じ書き方のファイルから規則を足せる(何回でも。後に書いたものほど強く、-excludeより弱い)。-
大文字・小文字は区別する(uvf・git と同じ)。uvf と違い、
.gitignore・.ignoreや隠しファイルを既定では外さない(比べるときは全部を見る)。 -
ファイル名(下の階層も含めた相対パス)で対応付ける。名前の大文字・小文字は Windows・macOS では区別しない。
- 大きさが違えば「違う」、同じなら中身をバイト単位で比べる(ファイルごとに並列)。
- 一覧は
区分,パス,旧の大きさ,新の大きさ,旧の更新日時,新の更新日時。-detailで中身が違うファイルの差分を 1 本ずつ書く(テキストは.diff、-keyがあり表なら.csv)。
4. 文字コード
- 自動で見分ける: BOM → BOM の無い UTF-16 → UTF-8 → CP932 と EUC-JP。固定するなら
-enc(両方)・-enc-old・-enc-new(utf8・cp932・eucjp・utf16le・utf16be)。 - 旧と新が同じ文字コードなら、変換せずにそのまま比べる(速い)。違えば両方を UTF-8 にそろえて比べる(差分の出力も UTF-8)。
UTF-16 は同じどうしでも UTF-8 に直す。 - NEC 特殊文字・IBM 拡張文字・半角カナも化けない。CP932 で同じ文字に符号が 2 つあるもの(NEC 選定 IBM 拡張と IBM 拡張の「髙」など)は、反映のときは同じ文字として扱う。
5. 形式
| 形式 | 比べるもの |
|---|---|
| テキスト・ログ・ソース | 行 |
| CSV・TSV | -key があれば表、無ければ行 |
| 圧縮(gz・bz2・xz・lzma・zst・lz4・br) | 展開した中身(片方だけ圧縮でもよい。中が CSV なら表としても) |
| Word(.docx) | 本文の文字(段落ごとに 1 行、表は 1 行ずつ) |
| Excel(.xlsx) | -key があればシートごとの表、無ければ取り出した文字 |
ページごとの文字(## page N の行のあとにそのページの行) |
Word・Excel・PDF は「取り出した文字」の比較です(書式・図・数式は比べない)。古い .doc・.xls、パスワード付き、文字の無い PDF は読めません。
6. 速さの目安(実測・Mac mini M4・外付け SSD)
| 比べるもの | 時間 |
|---|---|
| CSV 10GB × 2 本のキー照合(行順そろい/ばらばら) | 約 21 秒/約 23 秒 |
| テキスト 10GB × 2 本(行の並びを保つ比較) | 約 21 秒(画面に出るまで約 21 秒) |
| フォルダ 1 万本(片側 2.2GB) | 約 3 秒(キャッシュに載った状態) |
条件: Mac mini(Apple M4・10コア・メモリ 32GB)・外付け SSD/uvd 1.0.0/キャッシュを消していない値(10GB × 2 本はメモリに収まらないので cold に近い)。詳しい表と負けの条件は UwDiff の実測(docs/benchmarks.md) にあります。
実測の一覧のページ: UwDiff の実測
7. 困ったとき
- 「1 行が 4MB を超えています」: 引用符の閉じ忘れで、ファイルの残りが 1 つの値になっていることが多い。
-quote offを試す。 - 遅い・メモリが足りない: 行の順番がばらばらな巨大な表は、待ち行が大きくなる。
-memを小さくすると一時ファイルへ逃がして続ける。一時ファイルは-tmpで速い場所に。 - 文字化けする:
-enc-old・-enc-newで文字コードを固定する。 - 問い合わせ: https://github.com/amru195704/UwDiff/issues
開発者より: アプリ・Kindle本・公開プロジェクトの一覧は GitHub: amru195704 にまとめています。