[リストへもどる]
一括表示

投稿時間:2002/11/27(Wed) 10:13
投稿者名:砂嵐
Eメール:
URL :
タイトル:
不特定CSV取込
はじめまして。

テキストファイル読み書き色々とうところを拝見させていただいたんですが、
たとえば  テキストファイル(csvファイル)の中身が
1,東京,435,54
2,大阪,543
3,名古屋
4,福岡
の様に列数がばらばらの場合どうしたらよいですか?

投稿時間:2002/11/27(Wed) 10:55
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 不特定CSV取込
VBのバージョンによって処理が違いますが
Line Input で1行づつ読み込み[,]の位置を調べ変数に取り込みます。

投稿時間:2002/11/27(Wed) 14:48
投稿者名:砂嵐
Eメール:
URL :
タイトル:
Re^2: 不特定CSV取込
> VBのバージョンによって処理が違いますが
> Line Input で1行づつ読み込み[,]の位置を調べ変数に取り込みます。

1行づつ読みWRITE#で書きこんだ場合、文字列は""で囲まれます。
バイナリモードでオープンすると""は省かれるということですが、
バイナリモードでオープンした場合WRITE#が使えませんでした。
これもバージョンなど関係するのでしょうか?

投稿時間:2002/11/27(Wed) 15:27
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 不特定CSV取込(これではだめ!)
下記ではだめでしょうか? 但しVB6.0 (VB5.0 では不可)

Private Sub Command1_Click()
    Dim strTextLine As String
    Dim TmpTxt()    As String
    Dim dataN       As Integer
    Dim i           As Long
    Dim intFileNo   As Integer
    intFileNo = FreeFile
    Open "c:\sample.csv" For Input As #intFileNo
    Do While Not EOF(intFileNo)
        Line Input #intFileNo, strTextLine
        TmpTxt = Split(strTextLine, ",")
        dataN = UBound(TmpTxt)
        For i = 0 To dataN
            Debug.Print Replace(TmpTxt(i), """", "") & "   ";
        Next i
        Debug.Print
    Loop
    Close #intFileNo
End Sub

投稿時間:2002/11/28(Thu) 18:42
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re^3: 不特定CSV取込
> 1行づつ読みWRITE#で書きこんだ場合、文字列は""で囲まれます。
> バイナリモードでオープンすると""は省かれるということですが、
> バイナリモードでオープンした場合WRITE#が使えませんでした。
> これもバージョンなど関係するのでしょうか?

バイナリモードでは
"Put","Get"を使用しますね


バイナリモードでのデータの取り扱われ方について
簡単なサンプルを作ってみました^^
プロジェクトの保存先に"test.txt"というファイルを
作って、"A"と書かれたファイルを置きます("は要らないです)

Private Sub Command1_Click()
    Dim ff As Integer
    Dim s As String * 1
    Dim i As Integer
    Dim b(1) As Byte
    
    ff% = FreeFile()
    Open App.Path & "\" & "test.txt" For Binary Access Read As #ff%
        Get #ff%, , s$
    Close #ff%
    ff% = FreeFile()
    Open App.Path & "\" & "test.txt" For Binary Access Read As #ff%
        Get #ff%, , i%
    Close #ff%
    ff% = FreeFile()
    Open App.Path & "\" & "test.txt" For Binary Access Read As #ff%
        Get #ff%, , b()
    Close #ff%
    Debug.Print s$
    Debug.Print Hex$(i%)
    Debug.Print Hex$(b(0)) & Hex$(b(1))
End Sub

投稿時間:2002/11/27(Wed) 10:59
投稿者名:とろ
Eメール:
URL :
タイトル:
Re: 不特定CSV取込
> たとえば  テキストファイル(csvファイル)の中身が
> 1,東京,435,54
> 2,大阪,543
> 3,名古屋
> 4,福岡
> の様に列数がばらばらの場合どうしたらよいですか?

csv ファイルをデータベースとして扱えば、
足りない部分は Null として扱ってくれます。

1,東京,435,54
2,大阪,543,Null
3,名古屋,Null,Null
4,福岡,Null,Null
と同じような感じにすることができます。

投稿時間:2002/11/27(Wed) 11:08
投稿者名:砂嵐
Eメール:
URL :
タイトル:
Re^2: 不特定CSV取込
> csv ファイルをデータベースとして扱えば、
> 足りない部分は Null として扱ってくれます。
>
> 1,東京,435,54
> 2,大阪,543,Null
> 3,名古屋,Null,Null
> 4,福岡,Null,Null
> と同じような感じにすることができます

それはどのようにするのですか?

投稿時間:2002/11/27(Wed) 11:31
投稿者名:とろ
Eメール:
URL :
タイトル:
Re^3: 不特定CSV取込
ホントに大雑把に回答します。
d:\data.txt というテキストファイルに
以下の内容を書き込んで、
プログラムを実行してみて下さい。
イミディエイトウィンドウが同じ結果になるか確認して下さい。

# データファイルの先頭行からデータが入っている場合には、
# 別途 Schema.ini ファイルを用意する必要があります。

** d:\data.txt **
F1,F2,F3,F4
1,東京,435,54
2,大阪,543
3,名古屋
4,福岡

** コード **
Private Sub Form_Load()
  Dim cn As Object 'ADODB.Connection
  Dim rs As Object 'ADODB.Recordset
  Set cn = CreateObject("ADODB.Connection")
  cn.Open "Provider=MSDASQL.1;Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=d:\;"
  Set rs = CreateObject("ADODB.Recordset")
  rs.Open "select * from [data.txt]", cn
  Do While rs.EOF = False
    Debug.Print rs(0), rs(1), rs(2), rs(3)
    rs.MoveNext
  Loop
  rs.Close: Set rs = Nothing
  cn.Close: Set cn = Nothing
End Sub

** イミディエイトウィンドウ **
1  東京    435   54
2  大阪    543   Null
3  名古屋  Null  Null
4  福岡    Null  Null

投稿時間:2002/11/28(Thu) 12:59
投稿者名:砂嵐
Eメール:
URL :
タイトル:
Re^4: 不特定CSV取込
みなさんありがとうございます
解決しました