【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

あるデータベースから出力したCSV形式のデータがあるのですが、
文字コードがUTF-8なので、直接Excelで開くと文字化けがあります。
なので、一度出力したcsvファイルの拡張子をtxtに変えて、
それをExcelから開くという作業をして対応しています。
(そうすると文字コードが選択できるので)

しかしcsvをtxtに変えてExcelで開くと、
思いもよらぬところで改行されてしまい、
正しくデータが表示されません。

例)csvでそのまま開いたとき
ユーザーコード 苗字 名前 住所
001    山田 太郎 東京都大田区鵜の木 1-2-3
002    高橋 愛子 東京都港区六本木2-3-4
↓ txtに変換したのちにexcelで開いたとき
ユーザーコード 苗字 名前 住所
001    山田 太郎 東京都大田区鵜の木
1-2-3                  ←余計な改行が発生
002    高橋 愛子 東京都港区六本木2-3-4

これを回避するために、一度csvで開いて、
セル内改行コードを空白と置き換えるという作業をしたのですが、
それでも上記のような改行が発生してしまっています。

UTF-8のcsvを文字化けなくExcelで開く方法は他にはないでしょうか?
また上記方法の改善点はありますでしょうか?

ご助言宜しくお願いします。

A 回答 (2件)

もう読んでないかもしれませんが、、、



UTF-8 には BOM(Byte Order Mark)があるものと、無いものが
あります。公称ではありませんが、一般的には

 ・UTF-8 (BOM有り)
 ・UTF-8N(BOM無し)

などの呼び方で区別されるようです。

Excel で UTF-8 エンコードされた CSV を開くには、この BOM が
無いと文字化けします。そのシステムから出力された CSV は、
UTF-8N なのでしょう。対策として、

 ・TeraPad などのエディタで「文字コード指定保存」コマンドを
  使い、UTF-8(BOM有り)で保存しなおす
 ・VBA で BOM バイナリをくっつけてから開く

などの方法がとれそうです。

後者の VBA を利用するなら以下のようなソースになると思いますが、
エディタを使った方が簡単でしょう。

なお、下記ソースは必要最小限のことしか書いてません。試す場合は、
バックアップをとってからでお願いします。
勘違い回答ならばスルーの方向で。。

Public Sub OpenCSV_UTF8()
  
  Dim fn As String
  fn = CStr(Application.GetOpenFilename("CSVファイル (*.csv), *.csv", _
                     MultiSelect:=False))
  If UCase$(fn) = "FALSE" Then
    Exit Sub
  End If
  
  If AddUTF8BomBinary(fn) Then
    Dim wb As Workbook
    Set wb = Workbooks.Open(fn)
  End If

End Sub


' // UTF-8 エンコードされたファイルの BOM の有無を確認し、
' // BOM 無し(UTF-8N)ならば、BOM 付きで上書きする
'
Public Function AddUTF8BomBinary(ByVal fn As String) As Boolean

  Const adTypeBinary     As Long = 1
  Const adSaveCreateOverWrite As Long = 2
  
  On Error GoTo Err_

  ' UTF-8 BOM バイナリデータ
  Dim bin(2) As Byte
  bin(0) = &HEF
  bin(1) = &HBB
  bin(2) = &HBF
  
  ' ファイルからバイナリストリームを作成
  Dim stm1 As Object ' ADODB.Stream
  Set stm1 = CreateObject("ADODB.Stream")
  stm1.Type = adTypeBinary
  stm1.Open
  stm1.LoadFromFile fn
  
  ' UTF-8 BOM の有無確認
  Dim bHasBom As Boolean
  Dim i    As Long
  bHasBom = True
  For i = 0 To UBound(bin)
    If stm1.Read(1)(0) <> bin(i) Then
      bHasBom = False
      Exit For
    End If
  Next i

  ' BOM 無し(UTF-8N)ならBOMを加えて上書きする
  If Not bHasBom Then
    Dim stm2 As Object ' ADODB.Stream
    Set stm2 = CreateObject("ADODB.Stream")
    stm2.Type = adTypeBinary
    stm2.Open
    stm2.Write bin
    stm1.Position = 0
    stm1.CopyTo stm2
    stm1.Close
    stm2.SaveToFile fn, adSaveCreateOverWrite
    stm2.Close
  End If
  AddUTF8BomBinary = True

Bye_:
  On Error Resume Next
  stm1.Close: Set stm1 = Nothing
  stm2.Close: Set stm2 = Nothing
  Exit Function
Err_:
  MsgBox Err.Description, vbCritical
  Resume Bye_
End Function
    • good
    • 0

直接の回答ではないのですが……。



もしも、文字コードを変更しても良いのであれば、
http://www.vector.co.jp/soft/dl/win95/util/se326 …
というようなソフトで、shift-jis に変換してしまえばいいかと思います。

UTF-8 のまま編集する必要があるのなら(編集の規模にもよりますが)EmEditor というエディタをお勧めします。

http://jp.emeditor.com/

ちょっと高いですが(といっても、4,200円ですが)UTF-8 の、CSV ファイルを表示する・編集をするためには、十分な機能を持っています。
(UTF-8 を含む ユニコード対応と、csv 編集モードつき)

元々がエディタですので、文字の編集や検索・置換は得意ですし、csv で分離されたひとつの項目であれば、一括削除や、それをキーにしたソートも可能です。
    • good
    • 0
この回答へのお礼

早々のご回答ありがとうございます!
UTF-8のまま編集できるソフトがあるんですね。
ちょっと体験版を試してみたいと思います!
ただUTF-8のデータをほぼ参照するだけなので
(海外の登録者の名前などを見る)
有償ソフトを使うほどでもないかなぁ。。
でも奥の手はこちらのソフトを使用したいと思います。
有難うございました。

お礼日時:2010/01/08 14:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報