[Ruby]csvファイルを扱うならば、CSVクラスを使いましょう

広告


当たり前だろうと言われそうですが、想像以上に便利でした。Rubyなめてました。すみません。結構、無駄なコードを書いてしまったので反省を込めて

目次

CSVって何?

念の為のおさらいです。CSVとは、Comma Separate Valueの略で、要は、テキストファイルの中に、データがカンマ区切りで並んでいるデータ形式です

カンマで区切るという性格上、データ内にカンマを含めるには工夫(後述します)が必要です。

また通常、行は、改行で区切られているためデータ内に改行を含めることは出来ません。

今回は、先述記事にしたワートプレスに記事を一気に投入するためのプラグインReally Simple CSV Loaderを利用するためのデータ作成の為、CSVデータを作成する必要があります

blogの要素をCSV化するために必要なこと

二つの課題

タグをどうやって取り込むか

タグは、複数タグを取り込むならば、カンマ区切りになっています。そのままデータ化すると、一個目のタグ以外は、その次のフィールドデータとして取り込まれるか切り捨てられます

これを回避するには、ダブルクォーテション(“)で、データを、くくればOKです

記事は、どうやって取り込むか

ブログの記事部分は通常、改行がはいった状態になっています。

ただ、これは人間が見る場合の見やすさだけであって、ワートプレスのエディタで、テキストモードで開いた中身の全てのデータから改行を取り除いても、ウェブで見た場合の記事はの見た目は変わりません

ウェブの見た目上の改行は、<br /> <p></p> などを入れれば良いだけです。

その為、今回はコンテンツについては全て改行を抜いた状態で作ることにしました。

ちなみに、この方法でデータを、取り込んだ場合、取り込んだ記事をワートプレスのエディタで開くとすごく見難くかつメンテし辛くなります。
  取り込み後は、他の記事同様にワートプレスのエディタでメンテしたい場合は、取り込み後にデータを、更新するスクリプトを書く必要がありそうです。

 このプラグインRially Simple CSV Loaderであれば、そういうことも出来そうですが、今回はチャレンジしませんm(_ _)m

Rubyで、CSVクラスを使う意味

この仕組さえわかっていれば、実は、特別なクラスを利用しなくても、CSVファイルを取り扱う事ができます。

 

CSVファイルの読込

以下のようなスクリプトで、CSVファイルを読み込んで、配列に格納することが可能です。 取り込むファイルは、以下のようなCSVです。(WORDPRESSに既に取り込んである記事の記事ID(連番=id)と記事名(スラッグ=post_id)をCSVファイル出力したものです)

id,post_id
75,komatuza77
92,komatsuza

csvクラスを利用しない場合

    @ids=Array.new()
    File.open(filename) do |file|
      file.each_line do |line|
        line.chomp!  #最後の改行を予め削除
        @ids << line.split(",")
      end
    end

できなくは、ありません。予め行の最後の改行を削除の上、split(“,”)で、読み込んだ行を分割すれば、ちゃんと配列の配列に保存されますので、それをeachで回せば、必要なデータの取得も検索も可能です。 が、CSVクラスを入れると以下の一行で完結します。(requireを入れると2行ですが)

require "csv"

@ids=CSV.read(filename,headers: true)

これで、@idsに配列の配列で、保存されます。しかも、header: trueというオプションを入れると最初の1行目をヘッダーとして取り込んでくれるため、配列内の値へのアクセスが簡単になります。

CSV文字列の配列への変換

読み込みの際にもやりましたが、カンマ区切りの文字列を、配列にいれることがよくあります。この処理も、クラスがなくても利用できます。

@ids << line.split(",")

しかし、これもCSVクラスを使って以下のように記述出来ます。

@ids=line.parse_csv

配列をCSVへ変換

こちらも、CSVクラスなしでも実装可能です。

@array.join(",")

CSVクラスがあれば、以下のように実装可能です。

@array.to_csv

ただし、前者と後者では結果が異なります。後者は、最後に改行が入ります。このまま、ファイルに追加していくのであれば良いのですが、単にCSV形式の文字列が取得したいのであれば、以下のように記述する必要があります。

@array.to_csv.chomp!

このくらいでは、まだその真価を発揮しているとは言い難いですが、CSVクラスは、使いこなせると色々便利な機能があります。(tableのように、二次元のテーブルとして扱う機能や、各種コンバーターなど) しばらく、CSVファイルの作成、読み込みについては色々とスクリプトを書かないといけないので、勉強していこうと思います。

Ruby 2.3.0リファレンス・マニュアル>ライブラリ一覧>CSVライブラリ>CSVクラス

 

広告

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です