Excelの表からn行おきにデータを抽出するには?|脱Excelプログラミング

脱Excel プログラミング 脱Excel

文字列が入ったデータをExcelで扱っているときに、3行おきとか5行おきとか、「n行おきにデータを取り出したい」と思うことがあります。しかし、このようなときExcelでは意外と苦労します。より洗練された方法がないか、PythonとMATLABについて調べてみました。

スポンサーリンク

n行おきにデータを取り出したい

文字列が入ったデータをExcelで扱っているときに、3行おきとか5行おきとか、「n行おきにデータを取り出したい」と思うことがあります。

例えば、字幕の英日対比訳を校正しているような場合です。

動画に付加する字幕ファイルには、SRT形式やVTT形式などがありますが、以下はSRT形式のファイルの例です。左側の列は英語の字幕SRTファイル、右側の列は、日本語の字幕SRTファイルです。

字幕の番号、タイムスタンプ、字幕、空行と順番に記述されています。英語字幕から正しい日本語訳をできるだけ楽に作成したいのですが、このままの状態で、ChatGPTなどで翻訳をかけると翻訳精度が落ちてしまいます。そのため、字幕の文章の部分だけ取り出したいのです。この場合は、3行目、7行目、11行目・・・と4行おきに字幕データが入っているため、その行だけ取り出すことを目標にします。

Excelでn行おきにデータを取り出すには?

”Excel” + “n行おきに抽出”とネットで検索すると、いくつかの記事がでてきます。具体的には Excelのrow関数、index関数、vlookup関数などを駆使して行っているケースがほとんどですが、特定セルの参照しかできず、複数列にわたってまとめて行を抽出できるものではありません。また結果は、別シートや同じシートの別の場所に記載する方式になっています。

特定の行について、複数列にわたるデータをすべて抽出したい場合、Excelの関数を組み合わせて行うやり方は非常に難しく、個人的には避けたいところです。

Excel関数の乱用を避けつつ、n行おきにすべての列のデータを抽出したい場合、一番単純かつ原始的な方法は、行番号をnで割った余りの数でフィルターをかけることです。

具体的な手順は以下の3ステップです。

ステップ1)表の左端に “No.” と”mod”の2列を追加し、”No.”列には、1から順番に行番号をいれます

ステップ2)次に”mod”列に、”=(A2, n)”  (注: “A2″の”2″は2行目を、nはn行おきに取り出したいときの数値を表す) と入力します。例えば4行おきにデータを取り出したいとき、”mod”列の3行目には、”=(A3, 4)”と入力します。

以下は 4行おきにデータを取り出したい場合に、”mod列”に関数を入力した結果ですが、”mod”列に 0,1,2,3,0,1,2,3,・・・と0から3までの数字が繰り返し入っています。

ステップ3)最後にこの状態でフィルター設定を行い、”mod”列の値が “3”の行だけ選択すれば、文字列が入った行だけが表示されます。

row関数、index関数、vlookup関数など、Excelでいろいろな関数を組み合わせるのが好きでない人は、おそらくこのやり方がもっともシンプルでわかりやすいのではないかと思います。

しかし、このやり方でも最終的に目的の行だけを抽出するには、フィルターした行を別のシートにコピー&ペーストするなど、もうひと手間かかります。

そこで、ボタン1つで ファイル作成までできる方法がないか探ってみます。

Pythonでn行おきにデータを取り出すには?

Excel以外の方法でデータを加工するとなると、なんらかのプログラミング言語を使うことになります。プログラミングでは、事前のプログラム記述は手間がかかりますが、いったん作成してしまえば、実行ボタンを1回押すだけで即時に求めている結果が入手できます。

プログラミング言語にも様々な種類があります。どんな用途でも使えて汎用的、かつ無料のプログラミング言語で、いま最も人気なのは Pythonです。

Pythonで n行おきにデータを取り出すプログラムを ChatGPTに聞いてみると以下のような回答が返ってきます。

“input.xlsx”というExcelの表から4行おきにデータを抽出し、output.xlsxに記録するPythonのプログラムを書いてください。
Pythonでn行おきにデータを抽出

#の入ったコメント行を除くと、実質的には4行のプログラムです。Pythonが初めての人でも、簡単にできそうな気がしてきます。

ただ、Pythonはインストールして環境を整えるまでに手間がかかるため、「n行おきにデータを取り出す」ということをやりたいだけのためにインストールするのは ちょっと現実的ではないかもしれません。実際にPythonを使う場合には、よく利用される外部ライブラリと一緒にパッケージ化した “Anaconda” と呼ばれるディストリビューションを利用するのが一般的です。

ちなみに、Pythonのプログラミングを行うための設定手順を ChatGPTに聞いてみますと、数十行にわたる詳細な手順が返ってきます。

初心者の人がMacOS上でAnacondaを使って、Pythonのプログラミング環境をセットアップする手順を教えてください。

詳細は割愛しますが、おおまかには以下の手順を行うよう指示されます。

Python Anacondaのセットアップ手順

Pythonの場合、いったんインストールしてしまえば、その後はいろいろな用途に使えるのですが、最初の一歩のハードルが非常に高いため 「本格的にプログラミングを勉強しよう」と考えている人以外は、なかなか手が出しづらいでしょう。

MATLABでn行おきにデータを取り出すには?

Pythonよりももっと手軽に試せるプログラミング言語として”MATLAB”があります。

MATLABは本来有償のソフトウェアですが、MATLAB onlineというクラウドプラットフォームは、アカウントさえ作成すれば無料で利用できます。MATLABは有償前提で提供されているため、Pythonのようなオープンソースにありがちな、「セットアップのやり方やトラブルシューティングは、自分で調べて解決してね」という感じではありません。インストール、セットアップは初心者でもかなり楽にできます。(ただし、Pythonに比べて、ネット上の情報や書籍が少ないため、プログラミング上の課題にぶつかった場合、問題解決は多少難しい場合もあります)

MATLABで n行おきにデータを取り出すプログラムを ChatGPTに聞いてみると以下のような回答が返ってきます。

“input.xlsx”というExcelの表から3行目から4行おきにデータを抽出し、output.xlsxに記録するMATLABのプログラムを書いてください。
MATLABでn行おきにデータ抽出

%のついたコメント行を除くと、実質3行のプログラムです。

ただし、無料のChatGPT 3.5にMATLABに関するプログラム作成を依頼する場合には注意が必要です。無料のChatGPT 3.5では、MATLABに関する最新情報で適切に学習が行われていないようで、古い情報や間違ったプログラムを出力してくることがよくあります。

例えば先の回答にあるプログラムで、 xlsreadxlswrite をMATLABのヘルプで調べてみると、非推奨と書かれています。

 

xlsread は推奨されません。代わりに、readtable、readmatrix または readcell を使用してください。詳細については、互換性についての考慮事項を参照してください。

そこで、ヘルプページにかかれていた readtablewritetable 関数を使ってプログラムを書き直してみます。

MATLABでn行おきにデータ抽出 改良版

MATLAB onlineの場合、作成したプログラムやプログラムで利用するデータファイルは、すべてMathWorksが提供するクラウド上で管理されます。無料で保存できるデータの最大容量は 5GBです。(有償版の場合は、クラウド上は20GBが上限。ローカルPCにも保存可能)

プログラムで利用するデータファイルをアップロードしたい場合には、Webブラウザで MATLABドライブ にアクセスし、ファイルをクリック&ドラッグします。

プログラムの実行結果のファイルは、右上の「ダウンロード」ボタンで ダウンロードすることができます。

さて、実際にプログラムを実行した結果の output.xlsxファイルをダウンロードし、中身を確認すると、以下のようになっています。

まとめ:n行おきにデータを取り出す方法

Excelの表からn行おきにデータを取り出す方法をまとめると以下のようになります。

メリット デメリット
Excel ・Excelの中で作業が簡潔できる ・関数が難しい
・複雑な処理には限界がある
・最後にデータを手作業で加工しなければならない
Python ・プログラムは比較的簡単
・無料
・セットアップが難しい
・情報の入手は比較的容易
MATLAB ・セットアップが簡単
・プログラムは簡単
・(制限はあるが)無料
・(Pythonに比べると)情報の入手が難しい
・無償版の場合、クラウドにデータをアップロード、クラウドからダウンロードする必要がある

文字列が入ったExcelの表の加工、データ操作を Excelの中だけで行うことに限界を感じている場合には、MATLABのような比較的かんたんに試せるプログラミング言語で試してみると良いと思います。

MATLABの得意な行列の操作 文字列編

3つ以上の条件で不要な行を削除したいときはどうする?

上のセルと同じ値で空白セルを穴埋めするには?

ある列の値をキーに2つの表をマージする

MT5の取引履歴からトレードの月別傾向を示すグラフを作成する

 

脱Excel
スポンサーリンク