[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『U+0020(スペース)について』(フェンダー)
お客様から頂くCSVデータの中に
UTF8のU+0020(スペース)が含まれている場合があります。
その生データの場合はセルごとに""(ダブルコーテション)
で囲まれているのですが
こちらの作業上、""(ダブルコーテション)をはずして
保存して
別の作業してます。
そこで問題なのが
その際にUTF8のU+0020(スペース)がカンマと認識して
配列が1つ増えてしまうので
その場合、置換作業でUTF8のU+0020(スペース)を
通常のスペースに置換しています。
UTF8のU+0020(スペース)はエクセルや表計算ソフトで
カンマと認識してしまうのか
分かる方いらっしゃいますか?
その他、このようなデータの場合の
対処方法等ございましたら
アドバイスください。
どうぞよろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
問題の出るファイルの一部を、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
ありがとうございます。 参考にさせていただきます。
以前ダブルクォートで囲んであるカンマを そのままでも対応できるように
CSVパーサプログラムを作成することを考えていたのですが 現状は、表計算ソフトで修正してから(タブスペース含む) CSV入出力作業を行っております。 (フェンダー) 2014/01/07(火) 23:30
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
結果をチェックしていた表計算ソフトが
タブは指定せず、カンマ区切りのみで表示しているのにも
かかわらず、配列が分かれていたので
勘違いしていました。
結果、最初から、正常に動作されていたという事に
なります。
大変失礼いたしました。
(フェンダー) 2014/01/17(金) 08:39
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.