line inputで読み込む際の改行コードについて

解決


はいとん  2005-04-15 04:30:07  No: 120963

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 は改行コードまで読込と
あるのですが、どうも改行コードまで読んでないような感じがします。

どうすれば、エクセルの改行と本来の改行の区別がつけられるでしょうか?

ご教授おねがいします


ガッ  2005-04-15 04:58:48  No: 120964

> 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

コレクションで取得する関数です。
ノシ<でゎ


魔界の仮面弁士  2005-04-15 05:37:01  No: 120965

> いきなり私に当たるなんてあなたも(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行単位」での読み込みが可能です。


ガッ  2005-04-15 06:30:44  No: 120966

> んでは、次は私の番ですな(謎
では次に私の誤爆の弁解を(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


はいとん  2005-04-15 08:26:25  No: 120967

こんばんわ。
早速のレス本当にありがとうございます。

>とりあえず、自分の環境は明記しましょう。

申し訳ございません。
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の後ろには改行コードが入ると思っていました。

>「区別がつかない」というのは、具体的にはどういう状態でしょうか?
改行コードが無い無い!!なんの違いがあるのだ〜
と一人もがいてました。汗)汗)汗)

ガッさんのコレクションを返す関数なのですが、
とても難しくてキチンと理解できませんでした。
でも勉強になりました。本当にありがとうございます。


はいとん  2005-04-15 08:29:53  No: 120968

解決し忘れ


はいとん  2005-04-15 08:37:28  No: 120969

なんどもすみません。

やっぱり Line Input  で改行コードまで入ってました。

本当に単純に、エクセルの改行もCrLfだっただけの単純ミスだったようです。
m(_ _)mぺこり


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加