エクセル(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