[{"data":1,"prerenderedAt":433},["ShallowReactive",2],{"content-/cfws-diff-review-csv-normalization":3,"all-pages-for-dir":431,"og-image-/cfws-diff-review-csv-normalization":432},{"id":4,"title":5,"body":6,"category":410,"description":411,"extension":412,"meta":413,"navigation":414,"path":415,"project_name":416,"published":417,"publishedAt":418,"seo":419,"stem":420,"tags":421,"todo":428,"unpublished":417,"updatedAt":429,"__hash__":430},"pages/2026-04/2026-04-18/cfws-diff-review-csv-normalization.md","CFWS差分レビューとマッピングCSV正規化 - Excel差分検出からBS区分順ソートまで",{"type":7,"value":8,"toc":394},"minimark",[9,14,18,22,30,33,37,41,44,47,91,94,98,101,107,148,151,154,165,169,190,198,202,205,213,220,224,227,230,264,267,271,278,281,296,299,302,367,370,390],[10,11,13],"h1",{"id":12},"cfws差分レビューとマッピングcsv正規化","CFWS差分レビューとマッピングCSV正規化",[15,16,17],"p",{},"朝、Q3-4の_KK版（手修正Excel）とスクリプト出力を並べてExcel差分検出スキルを走らせた。構造変更だけで257件の行挿入/削除と86件の列挿入/削除が返ってきて、目視レビューの限界を突きつけられた。もう一つの軸は、昨日生成したcf-mapping-qa.csvの正規化。Q番号列が混ざっていて勘定科目の重複排除ができない状態を、68行のクリーンなマッピングテーブルに絞り込んだ。",[19,20,21],"h2",{"id":21},"背景",[15,23,24,25,29],{},"eurekapu-nuxt4では、Pythonスクリプトが各論点（Q番号）のキャッシュフロー精算表（CFWS）をExcelとして自動生成する。ユーザーが手修正した版（",[26,27,28],"code",{},"_KK","サフィックス付き）と比較して「何を直したか」を把握し、スクリプト側に反映する必要がある。",[15,31,32],{},"同時に、CF項目マッピング（どの勘定科目がどのCFラベルに対応するか）をCSVで管理しているが、前日にJSON→CSV変換した際にQ番号ごとに行を展開してしまい、勘定科目が正規化されていなかった。",[19,34,36],{"id":35},"_1-excel差分検出-kk版との構造差分","1. Excel差分検出 - KK版との構造差分",[38,39,40],"h3",{"id":40},"差分検出スキルの実行",[15,42,43],{},"差分検出スキルにソースExcelと_KK版の2ファイルを渡す。スキルは6カテゴリ（行挿入/削除、列挿入/削除、セル値変更、書式変更）で変更を拾い、サマリーを返す。",[15,45,46],{},"Q3-4の1回目の検出結果:",[48,49,50,63],"table",{},[51,52,53],"thead",{},[54,55,56,60],"tr",{},[57,58,59],"th",{},"カテゴリ",[57,61,62],{},"件数",[64,65,66,75,83],"tbody",{},[54,67,68,72],{},[69,70,71],"td",{},"行挿入/削除",[69,73,74],{},"257件",[54,76,77,80],{},[69,78,79],{},"列挿入/削除",[69,81,82],{},"86件",[54,84,85,88],{},[69,86,87],{},"セル値変更",[69,89,90],{},"10件",[15,92,93],{},"セル値変更10件はcf-mappingシートのマッピング修正だった。KK版でマッピングを手修正した後、CSVを正規化してから再度差分検出を走らせると、セル値変更は0件に落ちた。構造変更（行列の挿入削除）だけが残った。",[19,95,97],{"id":96},"_2-csv正規化-q_number列の排除と重複排除","2. CSV正規化 - q_number列の排除と重複排除",[38,99,100],{"id":100},"問題の発見",[15,102,103,106],{},[26,104,105],{},"cf-mapping-qa.csv","を開くと、A列にq_numberが入っていた。",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-csv shiki shiki-themes vitesse-light vitesse-light","q_number,account,cf_label,cf_type\nQ3-1,売掛金,売上債権の増減,operating\nQ3-1,商品,棚卸資産の増減,operating\nQ3-2,売掛金,売上債権の増減,operating\n...\n","csv","",[26,115,116,124,130,136,142],{"__ignoreMap":113},[117,118,121],"span",{"class":119,"line":120},"line",1,[117,122,123],{},"q_number,account,cf_label,cf_type\n",[117,125,127],{"class":119,"line":126},2,[117,128,129],{},"Q3-1,売掛金,売上債権の増減,operating\n",[117,131,133],{"class":119,"line":132},3,[117,134,135],{},"Q3-1,商品,棚卸資産の増減,operating\n",[117,137,139],{"class":119,"line":138},4,[117,140,141],{},"Q3-2,売掛金,売上債権の増減,operating\n",[117,143,145],{"class":119,"line":144},5,[117,146,147],{},"...\n",[15,149,150],{},"同じ勘定科目が複数のQ番号に登場するたびに行が増える。ExcelのINDEX/MATCHでaccountをキーにcf_labelを引くには、勘定科目がユニークでなければならない。",[38,152,153],{"id":153},"原因",[15,155,156,157,160,161,164],{},"JSONからCSVへの変換時に、Q番号ごとに展開していた。元のJSON（",[26,158,159],{},"cf_mapping_master","）は勘定科目で正規化されており、",[26,162,163],{},"qs","配列で複数Q対応を表現している。CSV化の段階でその構造を崩していた。",[38,166,168],{"id":167},"修正-account-cf_label-cf_typeでユニーク化","修正: (account, cf_label, cf_type)でユニーク化",[15,170,171,172,174,175,178,179,182,183,186,187,189],{},"JSONの",[26,173,159],{},"から直接、",[26,176,177],{},"(account, cf_label, cf_type)","の3列でユニーク化したCSVを再生成した。同じaccountで",[26,180,181],{},"cf_label","が",[26,184,185],{},"none","と実ラベルの両方を持つ場合は、",[26,188,185],{},"を除外してメインのマッピングだけ残す。",[15,191,192,193,197],{},"結果、Q別展開で膨らんでいた行数が ",[194,195,196],"strong",{},"68行"," に収まった。",[19,199,201],{"id":200},"_3-ファイルロックとの格闘","3. ファイルロックとの格闘",[15,203,204],{},"ソート後にCSVを上書きしようとしたら、Excelで開いたままだった。",[108,206,211],{"className":207,"code":209,"language":210},[208],"language-text","Error: EBUSY: resource busy or locked, open 'cf-mapping-qa.csv'\n","text",[26,212,209],{"__ignoreMap":113},[15,214,215,216,219],{},"Windows環境ではExcelがファイルを排他ロックする。別名（",[26,217,218],{},"_v2.csv","）で出力して作業を続行し、Excelを閉じてから元ファイルに上書きした。地味だが、Windows + Excel + CLIの組み合わせでは毎回踏む罠になっている。",[19,221,223],{"id":222},"_4-bs区分順ソート","4. BS区分順ソート",[15,225,226],{},"最初はaccount名のアルファベット順でソートしたが、「流動資産→固定資産→流動負債→固定負債の順に並べてほしい」という要望が来た。",[15,228,229],{},"accounts_masterのBS区分情報を使って、以下の優先順位でソートし直した:",[231,232,233,240,246,252,258],"ol",{},[234,235,236,239],"li",{},[194,237,238],{},"流動資産",": 受取手形、売掛金、商品、製品、仮払消費税等",[234,241,242,245],{},[194,243,244],{},"固定資産",": 建物、機械装置、土地、投資有価証券、長期貸付金...",[234,247,248,251],{},[194,249,250],{},"流動負債",": 支払手形、買掛金、短期借入金、未払消費税等...",[234,253,254,257],{},[194,255,256],{},"固定負債",": 社債、長期借入金、退職給付引当金...",[234,259,260,263],{},[194,261,262],{},"為替・現金収支",": 為替差損益、現金及び預金",[15,265,266],{},"BS区分順に並んだCSVは、Excelシート上でも「上から順に資産→負債」と視線が流れ、レビューしやすくなった。",[19,268,270],{"id":269},"_5-差分ドキュメント化","5. 差分ドキュメント化",[15,272,273,274,277],{},"2回目の差分検出（CSV正規化後）の結果を、",[26,275,276],{},"memo/2026-04-18/cfws-q3-4-kk-diff.md","に詳細ドキュメントとして残した。",[15,279,280],{},"記載内容:",[282,283,284,287,290,293],"ul",{},[234,285,286],{},"比較元・比較先のファイルパス",[234,288,289],{},"シートごとの構造変更（どの行が挿入/削除されたか）",[234,291,292],{},"変更の意図（KK版で何を直したかったのか）",[234,294,295],{},"スクリプト側で対応すべき修正方針",[15,297,298],{},"構造変更257件 + 列変更86件を全て記録したので、次回のスクリプト修正時にこのドキュメントを参照してひとつずつ潰していける。",[19,300,301],{"id":301},"試行錯誤のタイムライン",[48,303,304,314],{},[51,305,306],{},[54,307,308,311],{},[57,309,310],{},"時刻",[57,312,313],{},"作業",[64,315,316,324,332,339,346,353,360],{},[54,317,318,321],{},[69,319,320],{},"09:29",[69,322,323],{},"Excel差分検出スキルでQ3-4のKK版差分を検出",[54,325,326,329],{},[69,327,328],{},"-",[69,330,331],{},"cf-mapping-qa.csvのq_number列問題を発見",[54,333,334,336],{},[69,335,328],{},[69,337,338],{},"JSONからCSVを再生成（q_number排除、68行にユニーク化）",[54,340,341,343],{},[69,342,328],{},[69,344,345],{},"accountソートを依頼 → ファイルロックで別名出力",[54,347,348,350],{},[69,349,328],{},[69,351,352],{},"BS区分順（流動資産→固定資産→流動負債→固定負債）に再ソート",[54,354,355,357],{},[69,356,328],{},[69,358,359],{},"KK版マッピング修正後、2回目の差分検出（セル変更0件に）",[54,361,362,364],{},[69,363,328],{},[69,365,366],{},"差分ドキュメントをmemo/に詳細記録",[19,368,369],{"id":369},"学んだこと",[282,371,372,378,384],{},[234,373,374,377],{},[194,375,376],{},"CSV正規化は変換時にやる",": JSONの構造をCSVに落とす段階で、用途に合わせたキー設計をしないと後から手戻りが発生する。今回は「Q番号ごとに1行」ではなく「勘定科目ごとに1行」が正解だった",[234,379,380,383],{},[194,381,382],{},"差分検出→修正→再検出のサイクル",": KK版のマッピング修正をCSVに反映してから再度差分を取ると、ノイズが消えて構造変更だけが浮き上がった。修正と検証を交互に回すと差分が収束する",[234,385,386,389],{},[194,387,388],{},"ファイルロックは作業フローに組み込む",": Windows + Excelの排他ロックは避けられない。別名出力→後で上書きのパターンを標準手順にしておくと、作業が止まらない",[391,392,393],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":113,"searchDepth":126,"depth":126,"links":395},[396,397,400,405,406,407,408,409],{"id":21,"depth":126,"text":21},{"id":35,"depth":126,"text":36,"children":398},[399],{"id":40,"depth":132,"text":40},{"id":96,"depth":126,"text":97,"children":401},[402,403,404],{"id":100,"depth":132,"text":100},{"id":153,"depth":132,"text":153},{"id":167,"depth":132,"text":168},{"id":200,"depth":126,"text":201},{"id":222,"depth":126,"text":223},{"id":269,"depth":126,"text":270},{"id":301,"depth":126,"text":301},{"id":369,"depth":126,"text":369},"dev","Excel差分検出スキルでKK版との構造差分を検出し、cf-mapping-qa.csvからq_number列を排除して勘定科目を正規化。JSON→CSV変換時のQ別展開問題を解消し、BS区分順に並び替えた記録。","md",{},true,"/cfws-diff-review-csv-normalization","eurekapu-nuxt4",false,"2026-04-18T00:00:00.000Z",{"title":5,"description":411},"2026-04/2026-04-18/cfws-diff-review-csv-normalization",[422,423,424,425,426,427],"キャッシュフロー計算書","Excel","差分検出","CSV","正規化","Python","memo",null,"_6uyyuOBi6qETRzRNSsT1BZlxMSYMkwt3bzNa1vkWfo",[],"https://log.eurekapu.com/og/blog/cfws-diff-review-csv-normalization.png?v=2026-04-18T00%3A00%3A00.000Z&title=CFWS%E5%B7%AE%E5%88%86%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A8%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0CSV%E6%AD%A3%E8%A6%8F%E5%8C%96%20-%20Excel%E5%B7%AE%E5%88%86%E6%A4%9C%E5%87%BA%E3%81%8B%E3%82%89BS%E5%8C%BA%E5%88%86%E9%A0%86%E3%82%BD%E3%83%BC%E3%83%88%E3%81%BE%E3%81%A7&author=Kei%20Komatsu&sig=9066b7b910f9bc59",1780786052875]