エクセル(Excel)で作ったデータを CSV で保存して phpMyAdmin へインポートするために下記の問題を解消する。
1.文字コードをUTF-8にする。
エクセルで CSV ファイル形式に保存すると、文字コードは SJIS になる。MySQLの設定にもよるが、私が使用している環境では基本的に文字コードはUTF-8に設定しているので、保存時にUTF-8で保存したい。現状は SJIS で保存されている CSV ファイルの文字コードを UTF-8 に変換して保存しなおしている。
■下記を参考
100年バリア: ExcelデータをUTF-8なCSV(;区切り)で保存する
2.フィールドをダブルクォーテーションで囲む。
phpMyAdmin のフィールドの囲い記号が「ダブルクォーテーション(”)」になっているが、エクセルで CSV ファイル形式に保存してもダブルクォーテーションでは囲ってくれない。ついでに、phpMyAdmin のフィールドの区切り記号のデフォルトは「セミコロン(;)」になっているけど、エクセルで保存すると「カンマ(,)」で保存されるので、セミコロンで保存されるようになるとひと手間なくなってうれしい。
■下記の解答番号 No.3 を参考
CSV形式での保存時に”文字列引用符”にしたい(エクセル) -OKWave
1.と 2.の両方を兼ね備えた VBA マクロ
この二つのマクロを合体させて、少々変更したら出来る。
Sub CSVExport_W_Qt_UTF8() ' ********************************** ' 初期設定 ' ********************************** ' オブジェクト変数の定義 Dim file_source As Object Dim file_target As Object Dim code_source As String Dim code_target As String Dim char_temp As String ' 文字コードを指定 code_source = "Shift_JIS" code_target = "UTF-8" ' 表示無効 Application.DisplayAlerts = False ' ********************************** ' CSVファイルの保存 ' ********************************** Dim Fname As String Dim usedRng As Range Dim i As Long, j As Long Dim buf As String Dim Fno As Integer Const Qt As String = """" Fname = Application.InputBox("出力名を入力してください。", Type:=2) If VarType(Fname) = vbBoolean Or Fname = "" Then Exit Sub If InStr(Fname, ".csv") = 0 Then Fname = Fname & ".csv" Fno = FreeFile() Open Fname For Output As #Fno With ActiveSheet Set usedRng = .UsedRange On Error Resume Next For i = 1 To usedRng.Rows.Count For j = 1 To usedRng.Columns.Count If Not IsEmpty(usedRng.Cells(i, j)) Then buf = buf & ";" & Qt & usedRng.Cells(i, j).Value & Qt Else buf = buf & ";" End If Next j Print #Fno, Mid$(buf, 2) buf = "" Next i On Error GoTo 0 End With Close #Fno Beep ' ********************************** ' CSVファイルをUTF-8に変換 ' ********************************** ' ADODB.Streamを参照 Set file_source = CreateObject("ADODB.Stream") ' CSVファイルの読み込み With file_source .Charset = code_source .Open .LoadFromFile Fname char_temp = .ReadText End With ' CSVファイルの書き出し Set file_target = CreateObject("ADODB.Stream") With file_target .Charset = code_target .Open .WriteText char_temp End With ' 文字コードの変換 file_source.copyto file_target file_target.savetofile Fname, 2 End Sub
使えればOKというレベルのツールなので、本当に合体させただけで統一感が全くないが問題なく動く。
フィールド内のデータのエスケープはしていない点に注意。
はじめまして。
完全な素人ですが、少しづつ貴方のサイトで勉強させて頂いています。
エクセルで作成したデータをCSVに変換してphpMyAdminにインポートする事は出来たのですが、
再度エクセルで作成したデータを編集したものをインポートするとエラーが出てしまいます。
上書きでインポートする事は不可能なのでしょうか?
身近に質問できる方がいなくて…..
申し訳ありませんが、ご教示頂けると幸いです
コメント:ima | 2012/04/25 水曜日 21:35
> imaさん
CSVのインポートはデフォルトではレコードの追加という形になります。
そのため、既存データの auto_increment や UNIQUE と衝突して、エラーが出ているのではないでしょうか。
上書きするときは、[インポートするファイルの形式]で[CSV]を選択したときに出てくる、[CSVオプション]の下記の項目から該当するものにチェックを入れて実行してみたらうまくいくと思うのですが。
・テーブルデータを差し替えるファイル
・重複している行を無視する
コメント:zon | 2012/04/26 木曜日 8:20