エクセル(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というレベルのツールなので、本当に合体させただけで統一感が全くないが問題なく動く。

フィールド内のデータのエスケープはしていない点に注意。

トラックバック一覧

この記事にはトラックバックがついていません。

コメント一覧

  1. はじめまして。
    完全な素人ですが、少しづつ貴方のサイトで勉強させて頂いています。
    エクセルで作成したデータをCSVに変換してphpMyAdminにインポートする事は出来たのですが、
    再度エクセルで作成したデータを編集したものをインポートするとエラーが出てしまいます。
    上書きでインポートする事は不可能なのでしょうか?
    身近に質問できる方がいなくて…..
    申し訳ありませんが、ご教示頂けると幸いです

    コメント:ima | 2012/04/25 水曜日 21:35

  2. > imaさん
    CSVのインポートはデフォルトではレコードの追加という形になります。
    そのため、既存データの auto_increment や UNIQUE と衝突して、エラーが出ているのではないでしょうか。

    上書きするときは、[インポートするファイルの形式]で[CSV]を選択したときに出てくる、[CSVオプション]の下記の項目から該当するものにチェックを入れて実行してみたらうまくいくと思うのですが。

    ・テーブルデータを差し替えるファイル
    ・重複している行を無視する

    コメント:zon | 2012/04/26 木曜日 8:20

RSS feed for comments on this post.

コメント投稿

Sorry, the comment form is closed at this time.