複数のCSVファイルを取り込む方法について

1,769 views
Skip to first unread message

shirai...@gmail.com

unread,
Dec 20, 2018, 3:20:30 AM12/20/18
to QGIS初心者質問グループ
複数のCSVファイルからポイントデータを作成したいと思っております。

バッチ処理する方法ってあるのでしょうか?

少なければデリミティッドテキストレイヤの追加で行うのですが、数百ファイルあります。
どのようにすればよいでしょうか?


wata909

unread,
Dec 20, 2018, 3:32:41 AM12/20/18
to QGIS初心者質問グループ
shp形式のポイントデータを作成するのであれば、QGISではなく、コマンドラインからの作業になりますが
以下の記事が参考になるかと思います。

windows 環境で、入力csvファイルの緯度経度が lat lon みたいな形で書かれていて、入出力がWGS84であれば、csvファイルのある
フォルダで、以下のコマンドを実行すれば出来ると思います。

for /R %f in (*.csv) do ogr2ogr -s_srs EPSG:4326 -t_srs EPSG:4326 -oo X_POSSIBLE_NAMES=Lon* -oo Y_POSSIBLE_NAMES=Lat* -f "ESRI Shapefile" "%~dpnf.shp" %f

参考までに。

福岡

unread,
Dec 20, 2018, 3:51:47 AM12/20/18
to QGIS初心者質問グループ
こんにちは

以前、テキストファイルをコマンドプロンプトで結合したことがあります。
CSVを1つにまとめて、QGISに取り込むという手もあると思いました。ざっと検索して、わかりやすそうだったサイトのURLを記載しておきます。

大量のtxt・csvを10秒で結合する初心者でも簡単な方法!超図解!

shirai...@gmail.com

unread,
Dec 20, 2018, 5:36:59 AM12/20/18
to QGIS初心者質問グループ
ありがとうございます。
試してみます。

shirai...@gmail.com

unread,
Dec 20, 2018, 6:42:53 AM12/20/18
to QGIS初心者質問グループ
 ogr2ogrでは
変換はできたようですが、エラーが出ていました。
シェープファイルを確認するとフィールド数がシェープファイルの制限数に達していたようで、
途中からなくなってしまっていました。


CSVを一つのファイルに合体させるのも手なのですがファイル名(レイヤ名)を内部に持たせたかったのでうまくいかず。
あとこのやり方だとフィールド名もくっついてしまいますよね。


なかなか難しいです。

wata909

unread,
Dec 20, 2018, 8:54:15 AM12/20/18
to QGIS初心者質問グループ
こんばんわ、

フィールド数の問題であれば出力ファイル形式を変えれば行けると思います。

for /R %f in (*.csv) do ogr2ogr -s_srs EPSG:4326 -t_srs EPSG:4326 -oo X_POSSIBLE_NAMES=Lon* -oo Y_POSSIBLE_NAMES=Lat* -nln %~dpnf -f SQLite "test.sqlite" %f -append

で、spatialiteに出力できました。なおこれですと、test.sqliteのなかに、csvがレイヤとして保存されます。
ただ、フィールド数は50ぐらいまではダミーで作りましたが、正しくは検証しておりません。


wata909

unread,
Dec 20, 2018, 8:58:52 AM12/20/18
to QGIS初心者質問グループ
あ、本件、discordのQGIS雑談で、n_aritaさんからアドバイス頂きました。ありがとうございますm(__)m

wata909

unread,
Dec 20, 2018, 9:16:01 AM12/20/18
to QGIS初心者質問グループ

shirai...@gmail.com

unread,
Dec 20, 2018, 7:28:23 PM12/20/18
to QGIS初心者質問グループ
wata909さま
ありがとうございます。

実行してみました。

以下のようなエラーが出ました。
ERROR 1: Unable to write feature 1 from layer CSVのファイル名
ERROR 1: Terminating translation prematurely after failed

フィールド数は1046あります。

フィールド数を削ってRか何かでテキスト処理する方法も考えてみます。



wata909

unread,
Dec 20, 2018, 8:16:33 PM12/20/18
to QGIS初心者質問グループ
なるほど。

1000以上のフィールドで作ってみて試してみましたが、たしかにエラーが出ますね。
こちらでは、上記のエラーの前に

ERROR1 : fail to prepare SQL

というエラーが出ましたが、いかがでしょうか?

それからちょっと初めにもどって、「CSVファイルからポイントデータをつくる」ですが、
作った後にどのように使うかによって、どの様に変換するのか、方法も少し変わってくると思います。
単純に、表示するだけであればcsvのままでもいい、という選択肢もあるかもしれません。

wata909

unread,
Dec 21, 2018, 12:28:34 AM12/21/18
to QGIS初心者質問グループ
こんにちは

discordのチャットの方で、@yoh_chan さんにうかがったところ、SpatiaLiteのもとになっているSQLiteの制限ではないか、
とのことでした。変数は最大999までのようです。

Maximum Number Of Host Parameters In A Single SQL Statement



ご参考までに。

adachi

unread,
Dec 24, 2018, 9:27:14 PM12/24/18
to QGIS初心者質問グループ
①csvファイルの読み込み→②shpファイルへのエクスポート という2段階の手間ですが…
pythonとプラグインを駆使してできそうでしたので情報共有させていただきます。
なおプログラミングは全くの素人なので、前半部分はネットからの受け売りです。


前提:Cドライブ直下の「temp」というフォルダにa.csvとb.csvがあり、この中の「x」「y」というフィールドにx座標y座標が記録されている
   ※このうちa.csvについてはフィールド数、レコード数ともに1000以上で試行してみました

動作条件:QGIS2.18
     ※QGIS3以降は、pythonの記述の仕方が変わったのか実行エラーが出ました…


1. 「プラグイン」メニュー > pythonコンソールを表示、「エディタの表示」をクリック




2. 出てきた右側のウィンドウに以下のコードをペースト
※黄色の部分を、お使いのデータに合わせて変える必要があります(たぶん)

import os.path, glob
layers=[]

for file in glob.glob('C:/temp/*'): # Change this base path
  uri = "file:///" + file + "?type=csv&xField=x&yField=y&spatialIndex=no&subsetIndex=no&watchFile=no&crs=epsg:4326"
  vlayer = QgsVectorLayer(uri, os.path.basename(file), "delimitedtext")
  vlayer.addAttributeAlias(0,'x')
  vlayer.addAttributeAlias(1,'y')
  layers.append(vlayer)

QgsMapLayerRegistry.instance().addMapLayers(layers)



3. 実行すると読み込まれます


4. Batch Save Layersというプラグインをインストール、起動

5. 以下のように設定




6. 「OK」をクリックすると、「Destination Folder」で指定したディレクトリの「ESRI Shapefile」というフォルダの中に変換後のシェイプファイルが保存されます
Reply all
Reply to author
Forward
0 new messages