当たり前だろうと言われそうですが、想像以上に便利でした。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クラス」
コメントを残す