mygems

CSVファイルをフィルターして必要な行だけを残す方法

CSVを値・範囲・複数条件で絞り込み、その行だけを保存。Excel、Sheets、コマンドライン、スマホ別に、それぞれの落とし穴も解説。

執筆: mygems ·

CSVのフィルター(絞り込み)は、ひとまとめにされがちな2つの作業です。条件に合う行だけを表示することと、その行だけを新しいファイルとして保存することです。1つ目はどのツールでもうまくできます。罠があるのは2つ目で、フィルター結果が40行しか表示されていなくても、表計算ソフトは40,000行すべてを平然と保存します。

結論を先に

  • 条件に合う行を見る: ExcelまたはSheetsで データ → フィルター を選び、値を指定します。
  • 条件に合う行だけを保存する: フィルターをかけ、表示されている行を選択して新しいシートにコピーし、そのシートを保存します。フィルター結果を直接書き出せるツールを使う方法もあります。
  • 大きなファイル、または繰り返す作業: 下で紹介する csvgrep、mlr、DuckDB のコマンド1つで済みます。
  • スマートフォンで: 変換した表計算ファイルではなく、本格的なフィルターパネルを備えたCSVアプリを使います。

Excelの場合

  1. データ内の任意のセルをクリックし、Ctrl+Shift+L(Macは ⌘+Shift+F)を押すか、データ → フィルター を選びます。
  2. 列見出しの矢印から値を選ぶか、数値フィルター / テキストフィルター で「より大きい」「を含む」などの条件を指定します。
  3. 複数の列のフィルターを組み合わせられます。重ねるほど結果は絞り込まれます。

フィルター結果だけを保存するには: 表示されている範囲を選択してコピーし、新しいシートに貼り付けて、そのシートをCSVとして保存します。オートフィルターがかかった範囲をコピーすると、Excelは表示されている行だけをコピーします。

罠: フィルターをかけたシートそのものをCSVとして保存すると、非表示の行も含めてすべての行が書き出されます。フィルターは表示を変えるだけで、データを変更するわけではありません。

列をまたいだOR(国がドイツ、または売上が10,000超の行)は、列同士をANDでしか結べないオートフィルターではできません。データ → 詳細設定 で条件範囲を使うと、別々の行に書いた条件がORで結ばれます。指定した範囲 にチェックを入れれば、結果を別の場所へ一度に書き出せます。

また、これはCSVなので、IDや郵便番号、桁数の長い数値が含まれている場合は、ダブルクリックではなくインポートで開いてください。そうしないと、絞り込みに使う値がすでに書き換わっている可能性があります。ExcelがCSVのデータを勝手に変更するのを防ぐ方法を参照してください。

Googleスプレッドシート(Google Sheets)の場合

データ → フィルタを作成 はExcelと同じように使えます。ただ、この作業にはもっと便利な FILTER 関数があります。条件に合う行を別の場所に書き出し、常に最新の状態に保ってくれます。

=FILTER(A2:F, C2:C="Europe", E2:E<2000)

条件を追加するとANDで結ばれます。ORにしたいときは足し算にします: (C2:C="Europe")+(C2:C="Asia")。この数式を新しいタブに入れれば、そのタブがフィルター済みのファイルになります。そのタブを開いた状態で ファイル → ダウンロード → CSV を選びます。

コマンドラインの場合

表計算ソフトでは扱えない大きなファイルや、毎週実行するフィルターなら、クリックで作業するよりコマンドのほうが速く、毎回同じ結果になります。

grep は便利そうに見えて間違いのもとです。 行のどこにあってもテキストに一致するので、grep Europe は備考に「not Europe」と書かれた行にも一致します。ヘッダー行も落ちます。さらに awk -F, は、引用符で囲まれたフィールド内のカンマも含めてすべてのカンマで分割します。CSVを理解するツールを使いましょう。

csvkit:1つの列に対する完全一致またはパターン一致。

csvgrep -c country -m "Germany" in.csv > germany.csv
csvgrep -c email -r "@example\.com$" in.csv > example.csv

Miller:条件指定に。

mlr --csv filter '$country == "Germany" && $revenue > 10000' in.csv > out.csv

DuckDB:SQLで書けることなら何でも、どんなサイズのファイルでも。

duckdb -c "COPY (SELECT * FROM 'in.csv' WHERE country = 'Germany' AND revenue > 10000) TO 'out.csv'"

3つとも、ヘッダーを残し、引用符を正しく扱い、条件に合う行だけを書き出します。DuckDBについてはCSVにSQLを実行するガイドでさらに詳しく説明しています。

間違った行が出てしまうフィルターの失敗例

どれももっともらしい結果を返すので、それが危ないところです。

  • 大文字小文字と空白。 Germany、germany、Germany (末尾に空白)は、ほとんどのフィルターで3つの別の値として扱われます。絞り込む前に、その列の重複を除いた値を確認してください。
  • テキストとして保存された数値。 列がテキストだと revenue > 10000 は文字列比較になり、"9000" > "10000" は辞書順では真になります。ツールがその列を数値として認識していることを確かめてください。
  • 形式が混在した日付。 03/04/2026 は、ある出力では3月、別の出力では4月です。日付列で絞り込むのは、どちらの形式かを確認してからにしてください。
  • 空白セル。 空のセルはゼロなのか、不明なのか、該当なしなのか。フィルターは通常、「より小さい」条件から空白を黙って除外します。

スマートフォンの場合

スマートフォンでCSVを表計算ファイルに変換してからフィルターすると、上の問題がすべて起きるうえに画面も小さくなります。フィルター機能を備えたCSVアプリなら、ファイルをそのまま扱えます。

Smart CSV Viewer では、Filter をタップすると表の上にパネルが開きます。列ごとに条件を追加します。演算子は列の型に合わせて切り替わるので、数値の列は数値として、日付の列は日付として比較されます。確定する前に、Apply · 4 rows のようにボタンで残る行数がわかります。手早く絞り込むなら、セルを長押しして Filter by this value を選びます。

2つの条件(Continentが Europe と等しい、Budgetが 2000 未満)と、Apply, 4 rows と書かれたボタンがあるフィルターパネル
条件と、適用前の行数
30行中9行に絞り込まれた表。すべてヨーロッパの行で、上部バーの下にフィルターバーが表示されている
結果:30行中9行

Edit as SQL を使うと、条件がクエリに変わり、手で書き換えられます。結果を別の場所へ持ち出すには、行を選択してコピーします。コピーはフィルターに従い、表計算ソフトには本物のセルとして貼り付けられます。AIアシスタントに普通の言葉で行を頼むこともできます。送信されるのは列名だけです。

CSV File Viewer - Smart CSViPhone・iPad · Android

iPhoneとAndroid向けに作られたCSV用のフィルターパネル。型を考慮した条件、適用前に表示される該当行数、必要ならSQLも使えて、アップロードは一切ありません。

できること

match any や match none のグループで条件を組み合わせるのはProの機能です。通常のAND条件は無料で使えます。

よくある質問

CSVファイルをフィルターして、絞り込んだ行だけを保存するには?
ExcelやGoogleスプレッドシートでフィルターをかけ、表示されている行を選択してコピーし、新しいシートに貼り付けて、そのシートをCSVとして保存します。フィルターをかけたシートをそのまま保存すると、非表示の行も含めてすべての行が書き出されます。コマンドラインなら、csvgrep、Miller、DuckDB が条件に合う行だけを一度に書き出します。
ExcelなしでもCSVをフィルターできますか?
はい。Googleスプレッドシートなら無料でCSVをフィルターできます。csvkit、Miller、DuckDB などのコマンドラインツールはどんなサイズのファイルでもフィルターでき、スマートフォンのCSVアプリは変換せずにファイルを直接フィルターします。
CSVのフィルターで grep が間違った行を返すのはなぜですか?
grep は特定の列ではなく行のどこにあってもテキストに一致するので、別のフィールドにその単語がある行も拾ってしまいます。ヘッダーも落とします。区切りにカンマを指定した awk は、カンマを含む引用符付きのフィールドで分割を誤ります。代わりにCSVを理解するツールを使ってください。
ExcelでCSVをOR条件でフィルターするには?
オートフィルターは列同士をANDでしか結べません。列をまたいだORには、データ → 詳細設定で条件範囲を使い、それぞれの選択肢を別々の行に書いて、指定した範囲にコピーを選び、結果を別の場所へ書き出します。
数値のフィルターが間違った行を返すのはなぜですか?
列がテキストとして保存されている可能性が高く、その場合は値が辞書順で比較されます。'9000' は '10000' より後に並びます。列を数値に変換するか、数値として扱うツールを使ってください。

mygems — CSV EditorとSmart CSV Viewerの開発者。どちらも、表計算ソフトが大きなファイルで音を上げるために生まれたアプリです。