質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

791閲覧

MYSQLでリスト分だけCSVファイルを作る方法

nagak

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2021/07/13 16:55

SQLについて、どうか皆様知恵をお貸しください。

MYSQLで以下のような、約8万行あるlistテーブルと約2千万行あるdataテーブルを作りました。
listのそれぞれの単語には、dataの1つ目のカンマより前にある単語に一致するdataの行が複数ある状態です。

MYSQLで、listのそれぞれの単語に一致したdataの行を含んだ単語名.csvファイルを、すべてlistの単語分だけ作りたいです。
具体的に言うと以下の例のように、listの単語がnevadaだったらdataの先頭がnevadaの行を全て抽出しnevada.csvを出力します。そして、同様のものをlistの単語全てで作ることを目指しています。

listの中から任意の1つの単語分だけcsvファイルを作るのであれば正規表現で簡単にできると思いますが、sqlをあまり使ったことがないためlistの単語全部で実行する方法をまったく思いつきません。
listの単語は約8万個あるので手動でやるのは不可能です。

何かいい方法をご存知あれば教えていただきたいです。

動作環境:Windows10

list

1nevada 2clark 3pourpre 4mix 5berlinkreuzberg 6de 7cordoba 8ribera 9sanfrancisco 10   ・ 11   ・ 12   ・ 13

data

1okanagan,48.947308,-119.439239,2013-07-30 23:59:06 2britishcolumbia,48.947308,-119.439239,2013-07-30 23:59:00 3okanagan,48.947308,-119.439239,2013-07-30 23:59:00 4britishcolumbia,48.947308,-119.439239,2013-07-30 23:58:55 5okanagan,48.947308,-119.439239,2013-07-30 23:58:55 6britishcolumbia,48.947308,-119.439239,2013-07-30 23:58:41 7            ・       8            ・  9            ・

例:dataの中の先頭がnevadaの行を全て抽出しnevada.csvに出力

csv

1nevada,24.943466,121.224839,2012-07-01 00:00:00 2nevada,59.325155,18.073271,2012-07-01 00:00:00 3nevada,,-23.510974,-46.61278,2012-07-01 00:00:00 4nevada,55.85,-3.15,2012-07-01 00:00:00 5     ・ 6     ・ 7     ・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/13 18:01 編集

要するにlistテーブルとdataテーブルを結合して結果を取得したいということでしょうか? CSV出力することという要件が、質問本来の聞きたいことをマスクしている気がします。 今書いている時点のSQLをアップして頂けませんでしょうか。
nagak

2021/07/13 18:36

まずdataテーブル列名が左からtag, latitude, longitude, timeとします。 プログラミング言語風に説明すると、listテーブルを一行ずつ配列Xに全て格納し、ループして配列要素全てで以下のSQLを行うイメージです。 select tag, latitude, longitude, time, from data where tag = 'X' into outfile 'X.csv' fields terminated by ',' ; テーブルを結合して結果を取得したい訳ではないです。
退会済みユーザー

退会済みユーザー

2021/07/13 18:39

ご返信ありがとうございます。 プログラム側でCSV出力しているということでしょうか? SQLで結合して取得すると簡単だと思うのですが、 それではダメな理由があるということですね?
退会済みユーザー

退会済みユーザー

2021/07/13 18:45

listの各データの内容のCSVファイルを 1回のクエリで「XXX.csv, YYY.csv, ZZZ.csv」みたいに出力するのを、 一気に行いたいということですね?プログラム書かずにSQLだけで。
nagak

2021/07/13 18:59

誤解させてすみません、結合して取得するのがダメという訳ではないです。 最終的に実現できればどのような方法でも大丈夫です。 << listの各データの内容のCSVファイルを 1回のクエリで「XXX.csv, YYY.csv, ZZZ.csv」みたいに出力するのを、 一気に行いたいということですね? << まさにその通りです。 SQLを学び始めたばかりで知識が乏しいのもあり、SQLだけ実行しなければならないと思い込んでました。 C言語などできればプログラムを書いてやってみようと思います。 SQLだけでも可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2021/07/13 19:09 編集

プログラムも考慮してよいのですね。 ちょっと回答記載してみます。 SQLだけでもできなくはないと思います。
m.ts10806

2021/07/14 01:55

質問は編集できますので、本文に追記されたほうが良いかと
guest

回答1

0

ベストアンサー

方法を問わないようでしたので、プログラムとSQLを合わせた方法を記載します。
言語について書かれていないので、イメージで捉えてください。

Javaっぽいもの

1// listテーブル取得 2String selectSQL = "select word from list;"; 3List<String> listTableData = query(selectSQL); // listTableData には、["nevada", "clark"]のように入ってくる想定 4 5// csv出力用SQL(見やすいように*で取得してるので、必要に応じて変更) 6String outputSql = "select *, from data where tag = '%s' into outfile '%s.csv' fields terminated by ',';"; 7 8// listTableData数分ループ 9for (String data : listTableData ) { 10 // 最終的に"select *, from data where tag = 'nevada' into outfile 'nevada.csv' fields terminated by ',';"のようになる 11 query(String.format(outputSql, data, data));12}

上記のようにlistテーブルの情報を取ってきて、そのデータ分だけループする方法で可能です。
記述方法は言語によって異なるので、お調べ頂ければと思います。

投稿2021/07/13 19:49

編集2021/07/13 19:51
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagak

2021/07/14 11:57 編集

回答ありがとうございます。 実際にC言語プログラムを作成してみたのですが以下のようなエラーが出てしまいました。 ライブラリー関係のエラーだと思うのですが、解決方法がわからないのでご存でしたら教えていただきたいです。 一応、Cのソースプログラムと同じフォルダーにhファイルが入ったmysqlファルダーを置いてあり、以下のようにincludeしてあります。 #include "mysql/mysql.h" C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x115): undefined reference to `mysql_error' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x14e): undefined reference to `mysql_use_result' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x1d1): undefined reference to `mysql_query' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x1e5): undefined reference to `mysql_error' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x22d): undefined reference to `mysql_query' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x23d): undefined reference to `mysql_error' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x276): undefined reference to `mysql_fetch_row' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x298): undefined reference to `mysql_free_result' C:\Users\1576r\AppData\Local\Temp\cc0WXrcn.o:tagMatchFetch.c:(.text+0x2ab): undefined reference to `mysql_close' collect2.exe: error: ld returned 1 exit status
退会済みユーザー

退会済みユーザー

2021/07/14 16:48

includeは正しくできていると思います。 includeだけでなく、リンカー貼らないといけないのではないでしょうか? それと、この質問は今回の質問に関係ないので具体的な回答は控えさせていただきます。 (そもそも私自身Cは詳しくないので、別で質問立てる方が効率いいと思います。) それと、試しでやるならCとかC++じゃない方がいいと思います。 OSが何かわかりませんが、敷居の低いPythonとか、Java/C#とかがいいのかなと。 (もう環境用意しているようなので、今更感はありますが。。。)
nagak

2021/07/14 17:58

仰るとおりですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問