CSVファイルのインポートについて

このQ&Aのポイント
  • CSVファイルのデータベースへのインポート方法について説明します。
  • SQL Server上でCSVファイルの特定の情報のみを取り込む方法について解説します。
  • CSVファイルのデータをデータベースに取り込む際には、文字列の操作が必要です。
回答を見る
  • ベストアンサー

CSVファイルのインポートについて

SQL Server 2005 Standard, Windows XP(SP3)を使用しています。 あるツールから生成されるCSVファイルのデータベースへのインポートしたいと考えています。 しかし、CSVファイル以下のようなフォーマットになっています。 (・・・番号)は無視してください date,2009/05/27 (・・・1) name,test (・・・2) 時刻,A,B,C,D,E,F (・・・3) 11:13:05,1,2,3,4,5,6   (・・・4) 11:13:06,7,8,9,10,11,12  (・・・5) (以下4,5のようなデータが続く…) となっています。 1は日付情報、2は特に意味無し、3はカラムの情報としたい物 4(以降)はデータとなっています。 データベースへは "|" をカラムの区切りとすると 時刻 |A|B|C|D |E |F | 2009/05/27 11:13:05|1|2|3|4 |5 |6 | 2009/05/27 11:13:06|7|8|9|10|11|12| (・・・以降データが続く) 上記のように(3)をカラム情報にして、不必要な情報を省いた状態でデータを取り込みたいと考えております。 同じく上記の最初のフィールドのように、元データのdate情報を時刻情報と合わせてdatetime型として一つので取り込みたいと考えています。 この為には、文字列の操作が必要となってくると思いますが、SQL Server上ではこのような事はできるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

そういえば、前にサーバはSQL Server 2000で、クライアントPC側にはSSMSだけインストールされていると書かれていませんでしたか? ・ファイルはクライアントPC側にあって、サーバにあるテーブルにデータを入れたい  (処理の「実行」は、クライアントPC側で行う) ・ファイルはサーバ側にはコピーできない ・VBなどで多少の加工処理は書いてもよい(これもサーバでは実行できない) 上記のような理解ですが、それならばもっとも適した方法は、 1)VBなどで、ファイルを読み込んで1行目の日付を抜き出しつつデータ行の先頭に追加して別ファイルに書き出す処理だけを書く 2)BCPでファイルをサーバ側のテーブルにアップロードする  (BCPユーティリティは本来コマンドラインから実行するものです) です。 xp_cmdshellについては、exeも実行できますが、セキュリティ上の問題があるので、サーバで実行するのは嫌がられることがあります。 クライアントPCにもデータベースエンジンがインストールされているならば、実行させられるでしょうが、 結局サーバ側のテーブルに入れるにはBCPかOPENROWSETでリンクサーバ経由INSERTのいずれかが必要です。

itouke77
質問者

お礼

ご回答ありがとうございます。 的確なアドバイスで本当に参考になります。 >そういえば、前にサーバはSQL Server 2000で、クライアントPC側にはSSMSだけインストールされていると書かれていませんでしたか? その通りです。そこまで覚えていただいていて申し訳ありません。 (ツール面の機能統一をしたいので、2005に変更したいのですが当分先になりそうです。) >・ファイルはクライアントPC側にあって、サーバにあるテーブルにデータを入れたい  (処理の「実行」は、クライアントPC側で行う) >・ファイルはサーバ側にはコピーできない >・VBなどで多少の加工処理は書いてもよい(これもサーバでは実行できない) これも把握されている通りです。 csvを生成するソフトを入れる許可が下りればサーバー側でファイルを持てるのですが…。 >それならばもっとも適した方法は、 >1)VBなどで、ファイルを読み込んで1行目の日付を抜き出しつつデータ行の先頭に追加して別ファイルに書き出す処理だけを書く >2)BCPでファイルをサーバ側のテーブルにアップロードする ご提案いただいた上記の方法でトライしてみようと思います。 ちなみに調べてみたのですがxp_cmdshellは2005からの機能みたいで、2000上では使えないようですね。

その他の回答 (3)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

補足です。 >ちなみに調べてみたのですがxp_cmdshellは2005からの機能みたいで、2000上では使えないようですね。 そんなことはありません。SQL Server 2000でも使えます。 http://msdn.microsoft.com/ja-jp/library/aa260689(SQL.80).aspx むしろ、このストアドはテクノロジとしては古いです。 (xpはSQL Server 2000時代の拡張ストアドプロシージャのプレフィックスです。SQL Server 2005ではCLRが推奨されています)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

1) ストアドプロシージャを1本書く  以下のいずれかの方法でワークテーブルに読み込む。  ・BULK INSERT(カンマ区切り)  ・OPENROWSET(BULK フォーマットファイル使用)  ・xp_xmdshellによるBCP(カンマ区切り)  1行目の日付を変数に取り込む。  型変換して実テーブルにセットするときに時刻に日付をつないでINSERTする。 2) ストアドプロシージャを1本書く  以下のいずれかの方法でワークテーブルに読み込む。  ・BULK INSERT(デリミタなし)  ・OPENROWSET(BULK)  ・xp_xmdshellによるBCP(デリミタなし)  1行目の日付を変数に取り込む。  各行はコンマで切り出し、型変換して実テーブルにセットするときに時刻に日付をつないでINSERTする 3)SSISまたはDTSパッケージを作成する  1からつくらなくても、データのインポートユーティリティからパッケージは生成できます。  これにファイル先頭の日付を取り出す処理と、先頭列に日付を加える処理を追加します。 1)の方式は、先頭数行がデータ列ではなく、カンマの数が不足しているため、場合によってはうまく読み込めない ケースがあります。 (行スキップオプションはありますが、カンマが不足していると行カウントが正しくされない) 2)の方式は、カンマで文字列を切り出す処理に少し工夫が必要です。 (CHARINDEXを使うか、XMLを使うか、スカラー関数を作るか) 3)は行スキップが正確に働くので、データ取り込み部分は設定がわかりやすいですが、追加する処理は多少勉強しないと設定できないでしょう。 なお、1)2)の方法はサーバ側に対象ファイルが存在する必要があります。 それぞれをとても説明しきれないので、キーワードでMSDNをあたってみてください。

itouke77
質問者

補足

色々な方法を紹介していただいてありがとうございます。 1),2)はサーバーにデータがないとできないようですので、難しそうですが3)の方法を考えなくてはいけないかもしれません。 ただ、xp_cmdshellですがこれは外部で作成したexeを実行することが可能なようですが実際のところどうでしょうか? このexeに文字列を整形する機能を持たせることもできるのかなと考えています。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

できるかできないかといえば、できます。 インポート先のテーブルが存在せず、CSVの内容に基づいて新規作成したいということであれば、SSIS(SQL Server Integration Service)を使って、パッケージを作成すれば可能です。 ストアドプロシージャを書く方法でもできなくはないですが、一旦ワークテーブルに取り込んで動的クエリでテーブルを作成する必要があるため、ちょっと厄介です。 (インポート先のテーブルが既に存在する前提ならば、もっと簡単です)

itouke77
質問者

補足

ご回答ありがとうございます。 なるほどやはり何種類か実現手段があるのですね。 >(インポート先のテーブルが既に存在する前提ならば、もっと簡単です) 考えてみると確かにカラムの内容は固定になりますので、テーブルは存在していても問題ありませんね。 その場合どのような方法になるでしょうか?

関連するQ&A

  • SQL ServerにCSVをインポート

    SQL Server Express 2012にCSVファイルのデータをインポートさせたいと思っています。 SQL Server のデータのうち、主キーはdate型、その他はbit型、nvarchar型です。 SQL Serverのテーブルのデータには、#2013-01-01#, #False#, "あいう"などというデータがあります。 CSVは、Event.csvというデータです。 インポートするにあたって、BULK INSERTを利用しようとしています。 上記のデータで下記のコードをSQL Server Managemant Studio Expressで実行するとエラーとなります。 FROM 'D:\Business\Data\Event.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ); データを別の文字列にするべきなのか、#で日付やブール値を囲わない方がよいのか、あるいはカラム名の入ったCSVを用意するべきなのかなど、疑問が多いのですが、実際はどうあるべきなのでしょうか。 なお、上記のデータはもともとExcel のデータをVBAを使ってCSVファイルに出力したものなので、CSVの形式を別の状態のデータに変換することはできます。 もともとの目的は、ExcelのデータをSQL Serverのデータにインポートしたいだけです。 よろしくお願い致します。

  • CSVの特定のフィールドをインポート

    load data local infileでcsvをインポートしているのですが ヘルプなどを見ても特定のフィールドのみを選択する方法がよく分かりません たとえば csv:フィールドA、フィールドB、フィールドC、フィールドD、フィールドE、フィールドF MySQL:カラム1、カラム2、カラム3、カラム4、カラム5 だとします、それを フィールドA→カラム2 フィールドC→カラム3 フィールドD→カラム4 フィールドF→カラム5 という風に選択したいのですがどういう風に指定したらいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • aspファイルにcsvインポートのSQLを書きたい

    お世話になります。 当方サーバー管理初心者です。 社内イントラ内に古いaspファイルで構成されたイントラサイトがあります。 そのイントラサイト内のあるaspファイルの中に、ボタンがあり、ボタンをクリックしてインポートしたいCSVを指定し、 登録ボタンを押してCSVをインポートすると、社内にあるSQLサーバーにアクセスし、データを追加したいテーブルに CSV内のデータを追加したいのですが、その際のaspファイル内に記載する SQLコマンドはどのようになるのでしょうか? Insert Into データを追加したいテーブル名 Values ( 以降に何を入れたら良いかわかりません。 不足な情報があれば加筆修正いたします。 どうぞよろしくお願いいたします。

  • CSV fileを指定してSQLへimport

    現在どうにかしてCSV fileのある一定の行と列を除いて SQLへimport出来ないかと困っています。 内容は: Excelで記入欄を作り他の人に記入してもらい 記入欄に記入してもらった情報を 反映させたいSQLのテーブル反映させたい。 環境 Win全般 dbisql Notepadに書いたtest-sql構文です --## test-import insert into test.test_def(obj_num, name_1, name_2, etc_1, etc_2) --##ここで指定したいSQLテーブルを指定し LOAD DATA INFILE 'd:\\test\\test.csv' --##ここで読み込ませたいCSVファイルを指定し FIELDS TERMINATED BY ',', LINES TERMINATED BY '\r\n' --##ここでCSVの形式を認識させ with(a,"b" filler, ・・・・と この辺で行き詰っています。。。 列1と行Aには入力してもらいたい説明を入力したいです。 (importしたくない列と行になります) 列2以降の行Bから行Gまでの5つの情報をimportしたいという状況です。 (列3、列4と次々B、C、D、E、F、Gに入力してもらう) 状況が解り難かったらすみません。 よろしくお願いします。

  • 【ACCESS】インポート定義を使わないCSVインポート

    ACCESS VBAにてMDBにSQL文でCSVデータをINSERTしようとしています。INSERT自体はうまくいったのですが、データの型をうまくそろえられません。2日程ネットサーフィンしているものの良いサンプルを見つけられません。有識者の方、ご存知でしたら是非教えてください! まず、CSVデータは以下のようなものです。 ===aaa.csv=== 00000001,2009/1/31 00000002,2009/1/31 ・ ・ A000001,2009/1/31 Z000002,2009/1/31 ========== これを 既存テーブル:aaa_TBLに取り込ませたく、以下のSQL文を書きました。 INSERT INTO aaa_TBL(カラム1,カラム2) SELECT FORMAT([aaa#CSV].F1,'0000000'),[aaa#CSV].F2 FROM aaa#csv IN 'C:\' 'Text;HDR=NO' これにて「0000001」と「000002」等のレコードは正常に取り込むことができましたが、「A000001」「B000002」等のデータは取り込まれず、NULLにて登録されておりました。 (aaa_TBL自体はカラム1=テキスト型、カラム2=日付型でCreateされております。) これを回避したく、いろんなサイトを訪問したのですが、ほとんどがインポート定義を使った方法を推奨しておりました。 しかしながら、私にはどうしてもインポート定義が理解できないんです! 「VBAにて○○.iniを作成する方法」などをよく見かけるんですが、できるだけ他の方法を検討したいと考えております。(今後、ACCESS VBAから他言語への乗り換えを考えているとか、他CSVにてインポートされるテーブルの数が30個程あるので、インポート定義ファイルの管理がつらいな・・・とか色々他にも理由はあるんですが・・・・) 何か良い方法はないでしょうか?! やはりインポート定義を作らないとだめでしょうか?! その場合、簡単なサンプルコードなどを頂けますと非常に助かります。。。(MSサイトのサンプルコードは理解できませんでした。。。) まだVBAを勉強し始めて2週間なので、色々突っ込みどころはあると思いますが、どうぞよろしくお願いしますm(_ _)m

  • SQL*LoaderでCSVから指定した列のみインポートしたい。

    SQL*Loaderを用いてOracleのテーブルにデータを格納 しようと思っています。 格納するデータはカンマ区切りのCSVファイルです。 入力CSVファイルは他テーブル用のファイルなので、 ローダーで落とし込むテーブルとは列数が異なります。 ですので、「CSVの5列目の値をテーブルのAA_NOというフィールドに 格納する。ということが可能なのでしょうか?」 CSVファイルのある行が a,b,c,d,e,f というデータの場合、テーブルには a,e,f とインポートしたいのです。 よろしくお願いします。

  • csvファイルについて

    javaで、csvファイルを読み取り、データベースにいれるツールを作成しています。 csvファイルを読み込む部分でつまづいてしまったので、どなたかご教授ください! 指定されたcsvファイルを一行ずつ取り込むのですが、一つの情報が2行以上になってしまうデータがいくつかあり、ファイルチェックとして、1つ目のカラムは何文字のものだとかしているけれども、その前の行の続きに当たる行が、その条件から外れてしまい、エラーになってしまいます。(当たり前ですが、、、) なぜ、csvファイルが一行に収まらないのかが、わかずですし、それを一行として読み込むことができるのかが不明で困っております。   原因や対処法が分かれば、教えていただければと思います。 よろしくお願いします。

  • mysqlへcsvファイルの読み込み

    mysqlについて質問させて下さい。 エクセルをcsvファイルに変換したものを、データベースに読む込んだのですが、下記のエラーが出ます。 for column 'id' at row 1ect integer value: 'id,number 整数が間違っていると言うことかと思い、エクセルのほうはデータを全部数値にし、mysqlのほうは「int」にしました。 これでも同じエラーが出てしますのですが、原因がお解かりの方、教えて頂けると助かります。 sql文です。 LOAD DATA INFILE "***.csv" INTO TABLE dbname.tablename; カラムはidとnumberのみです。 よろしくお願いします。

  • CSVファイルのインポートについて

    宜しくお願いします。 CSVファイルをインポートしようとして、四苦八苦しています。item.csvというファイルをitemという名前のテーブルにインポートしようとしています。 load data local infile "item.csv" into table item fields terminated by ','; とコマンドを入力すると、 The used command is not allowed with this MySQL version というエラーが返されます。そこで、 load data infile "item.csv" into table item fields terminated by ','; と入力すると、 Access denied for user: '****@localhost' (Using password: YES) というエラーが返されます。 csvファイルの置き場所も解らないので、同じサーバの/public_html/test/php/csv/item.csvという位置と、/public_htmlよりもう一階層上のフォルダにitem.csvというファイルをアップしてあります。 相対パスやサーバがどの程度の階層まで検索してくれるのか解らないので、絶対パスでも指定してみましたが、全く同じエラーが返されてきました。 エラーの内容を翻訳してみたところ、 The used command is not allowed with this MySQL version 「使用されたコマンドは、このMySQL版で許されない」 Access denied for user: '****@localhost' (Using password: YES) 「ユーザー:『****@localhost』(パスワード:YESを使うこと)のために許されないアクセス」 という意味になりました。正直、どうすればいいのかさっぱりわかりません。この状況の打開策をご教授頂ければ助かります。何卒、宜しくお願い致します。尚、MySQLのバージョンはレンタルサーバの情報によると、「3.23.××以降」となっています。

    • ベストアンサー
    • MySQL
  • SQLサーバーにcsv.ファイルをインポート

    ACCESSデータベースをSQLサーバーへアップサイジングに挑戦しています。 csvファイルの取り込みについて質問させてください。 Accessでは、 DoCmd.TransferText acImportDelim, "○○インポート定義", "○○データ読込", filepath として、インポートしていました。 アップサイズ後、同じようにインポート定義を設定しようと思ったのですが、 ウイザードで設定できないのです。( 設定ボタンがグレーアウトしている。) それで、インポート定義なしでやってみたところ、 文字列フィールドで"00001"の表記が、すべて0が消えて"1"になってしまいます。 インポート後のテーブルのデータ型も、nvarcherになっているのですが・・ 正しいデータ型でインポートするにはどうすればよいでしょうか? よろしくお願いいたします。