[[20140107153814]] 『U+0020(スペース)について』(フェンダー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『U+0020(スペース)について』(フェンダー)

お客様から頂くCSVデータの中に
UTF8のU+0020(スペース)が含まれている場合があります。
その生データの場合はセルごとに""(ダブルコーテション)
で囲まれているのですが
こちらの作業上、""(ダブルコーテション)をはずして
保存して
別の作業してます。
そこで問題なのが
その際にUTF8のU+0020(スペース)がカンマと認識して
配列が1つ増えてしまうので
その場合、置換作業でUTF8のU+0020(スペース)を
通常のスペースに置換しています。

UTF8のU+0020(スペース)はエクセルや表計算ソフトで
カンマと認識してしまうのか
分かる方いらっしゃいますか?
その他、このようなデータの場合の
対処方法等ございましたら
アドバイスください。
どうぞよろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


普通にExcelに自動判断させて読み込むと、2バイトスペースは勝手に普通のスペースに変換し、
問題なく表示するようです。カンマ扱いはしないような?

問題の出るファイルの一部を、16進ダンプで表現し提示できますか?
あと、ダブルクォートをどのように外しているのか、マクロ提示または処理内容を説明できますか?
(???) 2014/01/07(火) 16:48


 返答ありがとうございます。

 〉あと、ダブルクォートをどのように外しているのか、マクロ提示または処理内容を説明できますか?

 CSV生データを加工する際に、入出力作業をカンマで読み込んでます。
 したがって、ダブルクォートで囲んであるカンマを取り除く作業を
 表計算ソフトで取り除いてから保存する際に
 自動的にダブルクォートが外れます。
 *この作業をしないと配列の中に含まれているカンマを
 配列の区切りとして判断してしまうからです。
 この仕事は2000件ぐらいの少ない仕事ですので
 作業は速いです。
 マクロの掲示はコード量がかなり多く
 その説明をするとかなり長いし、ご回答者様に理解していただけるまで
 時間がかかってしまいますので省略させていただきます。

 入出力作業する前に配列ごとのカンマ以外の
 カンマを削除しないといけないからです。
 その際に下記のようなタブスペースのようなものが
 ある時があります。

 テキストエディタで表示しますと下記になります。
 ご参考にどうぞ。

 08340,1072	 あいうえお,1

 上記ですとカンマは2つなのに配列が4つになります。

 バイナリエディタ(ユニコード)で示すと下記のようになります。

 30 38 33 34 30 2C 31 30 37 32 09 20 E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A 2C 31 0D 0A

 すいません。
 使用しているCSVエディタの問題だけで
 出力は出来るかもしれません。
 まだ検証してませんが・・・
 因みに置換作業で
 使用してるテキストエディタはCS Editorで
 区切り文字は
 カンマのみで開いてます。

 追記

 カンマで読み込むCSV入出力で検証したのですが
 ダメです。
 タブスペースがカンマと判断してしまいます。

(フェンダー) 2014/01/07(火) 20:07


 以前作ったコードですが,
 CSVの""内のカンマを無視するものです。

 Sub test()
    Dim fn, e
    Dim x, y, n As Long, txt As String, flg As Boolean
    Dim i As Long, ii As Long, a(), maxCol As Long
    fn = Application.GetOpenFilename("csv,*.csv", 1, "Open CSV", MultiSelect:=True)
    If Not IsArray(fn) Then Exit Sub
    n = 1
    For Each e In fn
        If FileLen(e) > 0 Then
            txt = CreateObject("Scripting.FileSystemObject") _
            .OpenTextFile(e).ReadAll
            x = Split(txt, vbCrLf)
            ReDim a(1 To UBound(x) + 1, 1 To 20)
            For i = 0 To UBound(x)
                y = Split(CleanCSV(x(i), Chr(2), Chr(3)), ",")
                maxCol = Application.Max(maxCol, UBound(y) + 2)
                If maxCol > UBound(a, 2) Then
                    ReDim Preserve a(1 To UBound(a, 1), 1 To maxCol)
                End If
                For ii = 0 To UBound(y)
                    a(i + 1, ii + 1) = y(ii)
                Next
            Next
            Sheets(1).Cells(n, 1).Resize(UBound(a, 1), maxCol).Value = a
            n = n + UBound(a, 1)
        End If
    Next
    With Sheets(1).UsedRange
        .Replace Chr(2), ",", xlPart
        .Replace Chr(3), vbNullString, xlPart
    End With
End Sub

 Function CleanCSV(ByVal txt As String, ByVal subComma As String, _
    ByVal subDQ As String) As String
    Dim m As Object
    Static RegX As Object
    If RegX Is Nothing Then Set RegX = CreateObject("VBScript.RegExp")
    With RegX
        .Pattern = "(^|,) *(""[^""]+"")(,|$)"
        Do While .test(txt)
            Set m = .Execute(txt)(0)
            txt = Application.Replace(txt, m.firstindex + 1, _
            m.Length, m.submatches(0) & Replace(Replace(m.submatches(1), _
            ",", subComma), """", subDQ) & m.submatches(2))
        Loop
    End With
    CleanCSV = txt
End Function
(seiya) 2014/01/07(火) 20:38

(seiya) さん
 ありがとうございます。
 参考にさせていただきます。

 以前ダブルクォートで囲んであるカンマを
 そのままでも対応できるように

 CSVパーサプログラムを作成することを考えていたのですが
 現状は、表計算ソフトで修正してから(タブスペース含む)
 CSV入出力作業を行っております。
(フェンダー) 2014/01/07(火) 23:30

スペース文字というより、TAB文字(09)が含まれているための問題かと思います。

CSVファイルを要素に分解する際、TABまたはカンマまたはスペースを区切り文字に
指定しますが、Excelはどれか1つの他に、複数指定もできます。カンマだけで
区切りたいのに、TABでも区切り文字指定しているのではないかと思います。

マクロによるCSVファイル読み込みにWorkbooks.OpenTextを使っているならば、
Tab:=False, Comma:=True, Space:=False になっているかどうか確認してみてください。
(???) 2014/01/08(水) 09:11


ご連絡遅くなりました。

エクセルではタブ区切りのチェックを外せば
通常通り取り込めますね。
Workbooks.OpenTextは使用してません。

ファイルからデータを読み込んで
ReadTxt.LoadFromFile (inFile)

Split関数でフィールド配列の分割格納を
カンマ指定しているのですが

タブ区切りで、カンマと認識しないように
色々と検証してみます。
どうもありがとうございました。

(フェンダー) 2014/01/10(金) 10:36


検証を行った結果、ReadTxtで読み込んだ
データは、カンマ以外では判定しませんでした。

結果をチェックしていた表計算ソフトが
タブは指定せず、カンマ区切りのみで表示しているのにも
かかわらず、配列が分かれていたので
勘違いしていました。

結果、最初から、正常に動作されていたという事に
なります。
大変失礼いたしました。

(フェンダー) 2014/01/17(金) 08:39


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.