テキスト・正規表現
一覧の重複・空行・余分な空白を取り除きたい
使うツール
メールからコピーした一覧、ログから抜き出した名前、手作業で集めたID。同じ形式のつもりでも、先頭の空白や重複が混ざると、次の作業に渡しにくくなります。行の整理は、こうした一覧を整える道具です。ただし、行が減って見た目がきれいになったことと、必要な情報が残ったことは同じではありません。
ここでは商品IDの架空リストを使い、前後空白の除去、空行の削除、重複の削除、並べ替えを順番に試します。個人情報や実際のアクセス権一覧を使わなくても、処理の性質は確認できます。元の順序や出現回数に意味がある場合は、その情報を残す設定から始めましょう。
まず、並べ替えずに元の一覧を見る
item-10
item-2
item-2
item-10
item-1最初は前後空白除去、空行削除、重複削除、ソートをすべて無効にし、行番号も付けずに実行します。入力と出力を見比べる基準を作るためです。初期設定のまま一度に全部処理すると、どの条件で何行減ったのかを追いにくくなります。実験用の六行を使い、設定を一つずつ有効にしてみてください。
空白を消すと、初めて重複になる
前後空白の除去だけを有効にすると、2行目のitem-2と4行目のitem-2が同じ文字列になります。item-10も同様です。この段階ではまだ二回ずつ残ります。次に空行削除、重複削除を有効にし、ソートは無効のままにすると、item-10、item-2、item-1の三行になります。最初に現れた順序が残っている点を確認してください。
item-10
item-2
item-1このツールは前後空白を除去してから重複を判定します。空白を含む文字列そのものを区別したいなら、前後空白除去を無効にする必要があります。たとえば固定幅のデータや字下げ付きの文章では、空白も情報です。処理後のリストしか残っていないと、消した空白や元の出現位置を結果から復元することはできません。
item-10がitem-2より前に来る理由
通常の文字列として昇順へ並べると、例のIDはitem-1、item-10、item-2となります。数字の部分を数として扱うソートを有効にすると、item-1、item-2、item-10になります。ファイル名や番号付き項目を人が読む順序に近づけたいときに役立ちますが、ID自体が数値へ変換されたわけではありません。元の文字列を並べる基準が変わっただけです。
並べ替えは実行環境のIntl.Collatorを利用します。英字の大小やアクセント、言語ごとの文字順は、単純なバイト順と同じではありません。異なる環境で完全に同じ順番を必要とする機械処理では、この画面の結果だけを契約仕様にしないでください。目的が元の優先順位の維持なら、ソートを無効にするのが適切です。
並び順の大小文字設定と、重複判定は別
Alpha
alpha
Alpha重複削除を有効にしても、Alphaとalphaは別の文字列として残ります。並べ替えの大小文字設定を変えたからといって、重複削除まで大小文字を無視するわけではありません。この二つを区別せずに使うと、『同じ名前を消したつもりなのに残っている』と感じやすくなります。どの処理に設定が効くかを、小さな例で確かめるのが確実です。
大文字小文字を同一視する業務規則があるなら、その規則が対象データに本当に適用できるかを先に確認します。ファイル名や識別子では、似た見た目でも別の対象かもしれません。二つの一覧の所属を大小文字無視で比べたい場合は、リスト集合演算の設定を使えます。ただし、そこで一致したことが、元のシステムでも同じ対象である保証にはなりません。
行番号は最後に付く。元の行位置ではない
整理後に行番号を付けると、出力の先頭から1、2、3と番号が付きます。削除した空行を含む元の六行の位置を示すものではありません。ソートを有効にすれば、その並べ替え後の順番に付番します。レビュー用の一覧には便利ですが、元ファイルの何行目が問題かを追跡するための番号と混同しないでください。
付けた番号も出力文字列の一部です。番号付きの結果を別のツールへそのまま渡せば、1. item-10のような文字列として扱われます。ID一覧として機械処理へ渡すなら、番号を付けない出力を使う方が適切な場合があります。人が読むための装飾と、次の処理に必要な値を分けて考えましょう。
重複を消すと、回数を数えられなくなる
ログに同じエラーが百回出た場合、重複削除すれば一行になります。種類の一覧を作る目的には便利でも、発生頻度の調査には情報が足りなくなります。注文行、投票、アクセス記録なども、同じ文字列の繰り返しが別々の出来事を表すことがあります。『重複しているから不要』ではなく、『今回必要なのは種類か、回数か』を先に決めます。
CSVの引用符内に改行があるデータを、そのまま一行一項目のリストとして処理することにも注意が必要です。見た目の改行がレコードの区切りとは限りません。CSVはCSV確認・編集で構造を読み取り、必要な列を取り出したうえで扱います。行の整理はCSVパーサーではなく、行区切りを単位とする文字列処理です。
渡す前に、消した情報を説明できるか確認する
最後に、出力が次の作業に合うかを確かめます。元の順序を保つ必要はないか、大小文字が違う項目を残す必要はあるか、空白を削ってもよいか、行番号が値へ混ざっていないか。一度きれいになった一覧を眺めるだけでは、消えた情報に気付きにくいため、元の入力も残して比べます。
『前後空白と空行を除き、完全一致する重複だけを除去。順序は最初の出現順』のように処理条件を添えれば、受け取る側も結果の意味を判断できます。ツールが自動保存する入力履歴に頼らず、必要な原本と処理条件は自分の作業手順で管理してください。整理の目的は短くすることではなく、次の処理へ正しい意味で渡すことです。
同じ操作でも、順序が違うと別の一覧になる
『alpha』『 alpha 』『alpha』の三行を考えます。前後空白を残したまま重複を消すと、中央の行は別の文字列なので二種類残ります。前後空白を除去してから重複を消せば、一種類です。どちらが正しいかは、この一覧が何を表すかによります。入力の揺れを含んだID一覧なら空白除去が役立つことがありますが、空白を含む文字列そのもののテストケースなら別物として残す必要があります。整理する前に、空白がデータなのか入力時のノイズなのかを決めます。
並べ替えにも似た問題があります。名簿の一覧なら名前順が便利でも、処理手順や優先順位の一覧では、並べ替えると意味が変わります。また、最後に付けた行番号は整理後の位置を示し、元ファイルの何行目だったかを保証しません。元の位置まで追いたい場合は、入力を別に残して差分を確認するなど、情報を失う前の段階を確保します。このツールは元データの監査履歴を保存しないので、整理済みの結果だけを唯一の原本にしないようにします。
実務では、いきなり全オプションを有効にするより、まず空行だけ、次に前後空白、最後に重複と並び順というように、変化の理由を一つずつ確かめると安心です。残る行数が想定と違ったら、その直前の操作へ戻って原因を調べられます。出来上がった一覧に対して『空白除去後の完全一致で重複をまとめ、名前順へ並べた』と説明できれば、別の人が同じ条件で作り直せます。きれいな見た目よりも、何を同じと判断して何を捨てたかが重要です。