タグ: csv

  • オープンデータの利用について

    エクセルのデータを可視化する案件についてChartJSやGoogleチャートを試しているうちに、集計の仕方やデータの見せ方など工夫すればいろいろ出来そうに思い、オープンデータの活用を考えてみることにしました。具体的に要望が上がってからの対応だと時間的な制約で余計なコストがかかったりしますので、ノウハウの蓄積を兼ねて実験的なものも含めていろいろ試してみようと思います。

    当サイトのオープンデータのページ

    Google Visualization のライブラリを使ってチャートとテーブルを表示しています。CSVデータは総務省で公開されているものを直接参照、と思ったのですがCORSの問題があって解決方法を考えていたところ、

    利用者にやさしいCSVオープンデータの作り方、特選やまなしの食オープンデータ事例

    こちらの記事に辿り着き、ひとまずCSVファイルを当サーバーに配置(UTF-8/LFに変換)して公開することにしました。

  • CSVファイルの数値と指数表示について – LibreOffice Calc

    先日、CSV形式のデータを編集していてトラブルになりかけましたので整理しておきます。

    問題になったのはCSV形式の顧客データで、利用者が希望のユーザIDを登録できるものでした。アルファベットのみやアルファベットと数字の組み合わせであれば良いのですが、数字のみのIDで桁数が多いと Excel や Calc の仕様によって指数表示に変換されてしまう場合があります。

    画面内でスクロールなしで見渡せる程度であれば気がつくかもしれませんが、データ件数が多い場合は知らないまに数値が指数表示に変換されて、しかも指数表示のままテキストデータとして保存されてしまいます。
    そのような問題を回避するには、数字のみの列を「テキスト」列として扱う必要があります。

    テストのために、次のようなサンプルのCSVファイルを用意しました。

    サンプルCSV

    これをLibreOffice Calc(またはExcel)で開くと、テキストインポートのダイアログが表示されます。

    テキストのインポート

    まずは「OK」ボタンをクリックしてそのままインポートしてみます。

    インポート結果

    桁数が多いセル(16桁以上)が指数表示になります。
    これを、そのまま上書き(CSV形式)で保存してみます。
    ※選択した書式を保持をクリック

    CSV形式で保存

    保存したCSVファイルをテキストエディタで開いてみると、16桁以上の行が指数表示のまま文字列として保存されています。

    テキストエディタで確認

    例えば、クレジットカード番号のような数字をIDとして登録していると、CSV形式で編集を行う際にデータを壊してしまう可能性があるということです。
    このような問題を回避するには次のようにします。

    テキストのインポート

    先ほどの「テキストのインポート」ダイアログで問題となる列を選んで列の種類を「標準」から「テキスト」に変更して「OK」ボタンを押します。

    インポート結果

    前回とは違って指数表示がなくなり、すべての桁が表示されています。
    適当に編集して上書きで保存してみます。

    上書き保存
    CSV形式で保存

    保存したCSV形式ファイルをテキストエディタで開いてみます。

    テキストエディタで確認

    16桁以上の行が指数表示に変換されることなく保存されています。
    そして「テキスト」形式の列にはダブルクオートが付いています。
    ここで、テキスト列のダブルクオートを外したい場合は、「名前を付けて保存」->「フィルタ設定を編集する」として、

    名前を付けて保存

    「テキストファイルのエクスポート」ダイアログで「テキストの区切り記号」を空にして保存します。

    テキストファイルのエクスポート

    出来上がったCSVファイルをテキストエディタで開いてみます。

    テキストエディタで確認

    以上です。

    ※下記のページを参考にさせていただきました。
    「Excel:指数表示にされてしまった数値を一気に直す」
    [XL2002]セルの数値が指数表示になる条件

  • LibreOffice Calc で CSVファイルを扱う

    LibreOfficeのCalcでCSVを編集して保存する際に区切り文字や
    クオートが思うようにならない場合があったので調べてみました。

    サンプルのCSV(メモ帳)

    このような、カンマ区切り、ダブルクオートなしのテキストファイルを用意します。

    ファイルのアイコンをマウス右クリックでCalcから開きます。

    「テキストのインポート」のダイアログが表示されます。

    インポートするCSVのフォーマットに合わせて「区切りのオプション」を
    適宜変更します。
    今回はカンマ区切りでクオートなしなので「テキストの区切り記号」を
    空にしておきます。

    OKボタンでファイルを開くとCalcのスプレッドシートにCSVの
    内容が表示されます。

    スプレッドシートの内容を編集します。

    編集が完了したら上書き保存して一旦ファイルを閉じます。
    そしてメモ帳で開いてみます。

    問題なさそうです。

    では次にCSVを読み込む際のオプションを変えてみます。

    ここでは区切りのオプションを「タブ」、「コンマ」、
    そしてテキストの区切り記号を「”」(ダブルクオート)
    にしました。

    そして同様にCSVファイルを開いて適当に編集し、上書き保存します。

    ODF形式ではない場合の確認ダイアログが表示されました。

    「選択した書式を保持」で保存します。

    メモ帳で開いてみると、タブ区切りでテキスト項目が引用符(ダブルクオート)で
    囲まれています。

    ファイルを開く際の「区切りのオプション」の選び方によって
    保存する際のCSVのフォーマットが変わってしまうようです。

    ということで、CSVファイルを開く際の「区切りのオプション」を正しく
    選んでおくとよさそうです。
    それと、CSVファイルを開いたときの状態がわからない場合は、
    上書き保存ではなくて「名前を付けて保存」として、
    さらに「フィルタ設定を編集する」をチェックしておけば、

    保存時に「区切りのオプション」を調整することができます。

    参考)LibreOffice Help CSV ファイルのインポートとエクスポート

  • gnuplotのデータプロットで日付を扱う場合

    gnuplotのグラフ出力において横軸を日付にしたい場合で、
    しかも日付データが都合の良い形式になっておらず
    ある程度編集が必要な場合を想定しています。
    ここでは日付を “2011/01/01” のようにスラッシュ区切り、
    0埋めの形式にしてみます。

    例えば日付データが次のような場合

    年、月、日がそれぞれ数値として別々のセルに入っている。
    ※値1、値2はrand()関数で適当な値を並べています。

    後の編集の都合により列を挿入しておきます。

    空白のセル(D2)に次の式を書きます。

    =TEXT(A2,"0000") & "/" & TEXT(B2, "00") & "/" & TEXT(C2, "00")
    

    実際の画面はこのようになります。(LibreOffice Calcの例)

    セルの内容が期待通り “2011/01/01” と表示されたらオートフィル機能により
    必要なところまでドラッグします。

    挿入した列に期待通りの日付がセットされたら、値の列も含めて
    必要な範囲を選択してコピーします。

    そして新しいシートを選択して「形式を指定して貼り付け」
    テキストと数のみにして貼り付けます。

    「名前を付けて保存」します。このときファイルの種類を「テキスト CSV」とします。
    ※Excelの場合は CSV(カンマ区切り)です。適宜読み替えてください。

    これでCSVデータが準備できたので、gnuplotにうつります。
    wgnuplotを起動
    CSVデータを保存したフォルダへ移動します。
    例えば、CSVデータをマイドキュメント内の gnuplot というフォルダに保存した場合。

    gnuplot> cd "C:/Users/(ユーザ名)/Documents/gnuplot"
    

    X軸を日付(time)にセットします。

    gnuplot> set xdata time
    数値形式(numerical)に戻す場合は、
    gnuplot> unset xdata
    または
    gnuplot> set xdata
    

    日付形式をセットします。

    gnuplot> set timefmt "%Y/%m/%d"
    

    オプションの詳細はオンラインドキュメントの
    “Time/Date data”
    の章を参照してください。
    http://www.gnuplot.info/documentation.html
    PDF形式で日本語のドキュメントも用意されているようです。
    次にセパレータをカンマ区切りにセットします。

    gnuplot> set datafile separator ","
    

    ここまでの作業でプロットの準備ができましたので、
    ためしにプロットしてみます。

    gnuplot> plot "datafile.csv" using 1:2 with linespoints;
    


    期待通りのグラフが画面に表示できたらこれを画像ファイルに保存します。

    現在の出力形式は、
    gnuplot> show terminal
    で確認できます。
    png形式で出力する場合は、
    gnuplot> set terminal png
    ちなみに、対応している出力形式の一覧は、
    gnuplot> set terminal
    

    そして、保存先のファイル名を指定します。

    gnuplot> set output "dataplot.png"
    

    これでプロットを実行すれば、出力結果がpng形式で”dataplot.png”に保存されます。

    gnuplot> plot "datafile.csv" using 1:2 with linespoints;
    

    このままだと出力先のファイルがロックされたままになりますので、
    プロットを実行した後は、出力先を元に戻しておきます。

    gnuplot> set terminal wxt
    gnuplot> set output