VB初心者です。
よろしくお願いします。
CSVを読み込んで、その中に『"』があれば、
○行目の○番目に『"』がある!!というプログラムを作成してるのですが、
普通に
Csvdata = FreeFile
Open "C:\text.csv" For Input As #Csvdata
Do Until EOF(Csvdata)
Input #Csvdata, Data
Loop
とすると、『"』でも区切られて意図したデータを読み込めません。
そこで、
Line Input #Csvdata, Data
一行ごとに読込→文字列を加工・チェック
とすると、例えばエクセルの改行Chr(10)と本来の改行 crlf との区別がつかず
困っています。
その他の説明を見ると、Line input は改行コードまで読込と
あるのですが、どうも改行コードまで読んでないような感じがします。
どうすれば、エクセルの改行と本来の改行の区別がつけられるでしょうか?
ご教授おねがいします
> VB初心者です。
> よろしくお願いします。
こんばんは。
いきなり私に当たるなんてあなたも(ry
(つ´∀`)つ
とりあえず、自分の環境は明記しましょう。
今はVBが過渡期あるので、暗黙の了解が危険なのです。
> CSVを読み込んで、その中に『"』があれば、
> ○行目の○番目に『"』がある!!というプログラムを作成してるのですが、
> 普通に
>
> Csvdata = FreeFile
> Open "C:\text.csv" For Input As #Csvdata
> Do Until EOF(Csvdata)
> Input #Csvdata, Data
> Loop
>
> とすると、『"』でも区切られて意図したデータを読み込めません。
ですねw;
> そこで、
>
> Line Input #Csvdata, Data
>
> 一行ごとに読込→文字列を加工・チェック
>
> とすると、例えばエクセルの改行Chr(10)と本来の改行 crlf との区別がつかず
> 困っています。
「エクセルの改行」というのが専門的で分かりませんが、
本当にLFしか書かれていないのなら、シーケンシャルアクセスをして、
文字列の読み取りをすると、その場所でEOFと解釈されてしまう感じがします(あやふや…)
> その他の説明を見ると、Line input は改行コードまで読込と
> あるのですが、どうも改行コードまで読んでないような感じがします。
感じがしますです。
…やっぱり、あやふやはいけませんね(orz
> どうすれば、エクセルの改行と本来の改行の区別がつけられるでしょうか?
>
> ご教授おねがいします
シーケンシャルアクセスではどうにもできない場合は、
「バイナリアクセスでゴリゴリ読み取る」という手段が残っています。
…今回は…そうですねぇ、こういうのはどうでしょう?
Public Function GetDoubleQuotPoint(ByVal FilePath As String, ByVal LineDelimiter As String) As Collection
'ファイル中の"が含まれる行のコレクションを返す関数
Dim v As Variant
Dim cnt As Long
Dim buf() As Byte
'コレクションを初期化
Set GetDoubleQuotPoint = New Collection
'ファイルを開いて、ファイル全てを読み込む
If FileLen(FilePath) = 0 Then Exit Function
Open FilePath For Binary As #1
ReDim buf(1 To LOF(1))
Get #1, , buf
Close #1
'カウントする
cnt = 0
For Each v In Split(StrConv(buf, vbUnicode), LineDelimiter)
cnt = cnt + 1
If InStr(1, v, """") Then
GetDoubleQuotPoint.Add cnt
End If
Next
End Function
コレクションで取得する関数です。
ノシ<でゎ
> いきなり私に当たるなんてあなたも(ry
んでは、次は私の番ですな(謎
>> とすると、例えばエクセルの改行Chr(10)と本来の改行 crlf との区別がつかず
>> 困っています。
「区別がつかない」というのは、具体的にはどういう状態でしょうか?
Line Input #ステートメントでは、vbCr または vbCrLf が行の区切りとして
判断される、とヘルプにあります。Excelの改行が vbCr だったとしたら
問題ですが、Chr(10) すなわち vbLf に関しては、そのまま読み込まれるため、
特に問題は無いような気がしますが……。
たとえば、当方の環境にて、
A1セル = "abc"、B1セル="def"
A2セル = "ghi(改行)jkl"、B2セル="mno"
A3セル = "pqr"、B2セル="stu"
というExcelデータをCSVで保存してみたところ、
abc,def(Cr)(Lf)"ghi(Lf)jkl",mno(Cr)(Lf)pqr,stu(Cr)(Lf)
というデータになりました。
そしてこれを Line Input # で読み込むと、
1回目 : abc,def
2回目 : "ghi(Lf)jkl",mno
3回目 : pqr,stu
となります。Excelの改行はそのままデータとして取得され、
「本来の改行と区別できない」という状態にはならなかったのですが……。
> 「エクセルの改行」というのが専門的で分かりませんが、
Excelでは、セル内の改行が Lf で表現されているのですよ。
(CSVにした時のレコードの区切りは、通常通り CrLf ですけれどね)
> 文字列の読み取りをすると、その場所でEOFと解釈されてしまう感じがします(あやふや…)
あ、それは初耳です。φ(。。)
ガッさんが予想された、Line Input # での読み取りが、LF で切れて
しまうという現象は確認できませんでしたが、もし、本当にそういう
現象に悩まされているのだとしたら、ADODB.Stream オブジェクトを
利用されると良いでしょう。
Line Input # では、Cr / CrLf の両方を改行コードとして認識して
しまいますが、Streamオブジェクトであれば、LineSeparatorプロパティと
ReadText プロパティにて、「CrLfまでの1行単位」での読み込みが可能です。
> んでは、次は私の番ですな(謎
では次に私の誤爆の弁解を(orz
> > 「エクセルの改行」というのが専門的で分かりませんが、
> Excelでは、セル内の改行が Lf で表現されているのですよ。
> (CSVにした時のレコードの区切りは、通常通り CrLf ですけれどね)
情報アリガトウございますw;
何分Excelファイルを扱うことが稀なので、本当に知りませんでした(orz
> > 文字列の読み取りをすると、その場所でEOFと解釈されてしまう感じがします(あやふや…)
> あ、それは初耳です。φ(。。)
と、ココで私は誤爆してしまいました。
誠に申し訳ございません…
近頃テキストファイルを扱っていないのが「あやふや」の原因でしたが、
先ほど色々な文字コードを書いて読み取る、というプログラムを作ったところ、
・Chr$(26)
がEOFコードらしきものでした(TT
…一体どこでLFをEOFと私は混同していたのやら…
;y=ー( ゜д゜)・∵. ターン
ノ<参考URL
http://x-web.pobox.ne.jp/fcgi/fcgi_f2.html
--------------------------
と言うことで、
・LFはEOFではない
でした。
ノシ<でゎ…本当に、誤爆失礼しました(_orz
…まだ誤爆してるかも、という不安は拭えず(ororz
こんばんわ。
早速のレス本当にありがとうございます。
>とりあえず、自分の環境は明記しましょう。
申し訳ございません。
VB:6(sp5)
os:2000pro
結論から申し上げますと、解決いたしました。
>Line Input #ステートメントでは、vbCr または vbCrLf が行の区切りとして
>判断される、とヘルプにあります。Excelの改行が vbCr だったとしたら
>問題ですが、Chr(10) すなわち vbLf に関しては、そのまま読み込まれるため、
>特に問題は無いような気がしますが……。
はい。まさにその通りです。
なんと、エクセルの改行自体CrLf改行されていました。汗)
何時間も頑張っていたのに、元のCSVの方には目が行っていませんでした。汗)汗)
それと
>Line Input #ステートメントでは、vbCr または vbCrLf が行の区切りとして
を
Line Input #ステートメントでは、vbCr または vbCrLf までが区切りとして
とも勘違いしていました。
なので、仮に
Line Input #Csvdata, Data
とすると、変数Dataの後ろには改行コードが入ると思っていました。
>「区別がつかない」というのは、具体的にはどういう状態でしょうか?
改行コードが無い無い!!なんの違いがあるのだ〜
と一人もがいてました。汗)汗)汗)
ガッさんのコレクションを返す関数なのですが、
とても難しくてキチンと理解できませんでした。
でも勉強になりました。本当にありがとうございます。
解決し忘れ
なんどもすみません。
やっぱり Line Input で改行コードまで入ってました。
本当に単純に、エクセルの改行もCrLfだっただけの単純ミスだったようです。
m(_ _)mぺこり
ツイート | ![]() |