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

投稿時間:2004/07/22(Thu) 15:59
投稿者名:ライオンマスク
Eメール:
URL :
タイトル:
CSVファイルの読み込みについて
CSVファイルを読み込むプログラムを作っているのですが、
CSVファイルの任意の行から下のデータを取る方法がわかりません。

国語,90
数学,75
社会,84
理科,72
英語,66

のようなデータで、社会から下のデータを取るような感じです。

すでに書かれているのかもしれませんが、よろしければアドバイスをください。
お願いします。

投稿時間:2004/07/22(Thu) 17:16
投稿者名:りっとっと
Eメール:
URL :
タイトル:
Re: CSVファイルの読み込みについて
ADOなどを使ってSQLで操作したほうが妥当でしょう。
csvFilePath = "c:\"
    csvFileNmae = "test.csv"
    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    '1行目をフィールド名として扱う場合は
    'cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & csvFilePath & ";Extended Properties=TEXT"
    '1行目からデータの場合は
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & csvFilePath & ";Extended Properties=""TEXT;HDR=NO;FMT=Delimited;"""
    Set rs = New ADODB.Recordset
    '1行目がフィールド名の場合は
    'rs.Open "select * from " & csvFileName & " where 科目 = '社会'", cn, adOpenStatic, adLockReadOnly
    'Text1.Text = rs.Fields("点数").Value
    '1行目〜データの場合は、フィールド名が左から"F1","F2"〜〜〜となる
    rs.Open "select * from " & csvFileName & " where F1 = '社会'", cn, adOpenStatic, adLockReadOnly
    Text1.Text = rs.Fields("F1").Value
    

あと、ADOを使わずに自力で関数を作る場合は
Private Data() As String
Private Enum FieldIdx
    Kamoku
    Tensuu
End Enum

Private Sub Command1_Click()
    Text1.Text = GetData("社会", Kamoku, Tensuu)
    
End Sub

Private Sub Form_Load()
    OpenCSV
End Sub

Private Sub OpenCSV(csvfilename)
    Dim bin() As String
    Dim strData As String
    
    Open csvfilename For Binary As #1
    ReDim bin(LOF(1) - 1)
    Get #1, , bin
    Close #1
    strData = StrConv(bin, vbUnicode)
    strData = Replace(strData, vbCrLf, vbLf)
    strData = Replace(strData, vbCr, vbLf)
    Data = Split(strData, vbLf)
End Sub
    
Private Function GetData(whereValue1 As String, whereIdx As FieldIdx, selectIdx As FieldIdx) As String
    Dim cnt As Long
    For cnt = 0 To UBound(Data)
        If Split(Data)(whereIdx) = wherevalue Then
            GetData = Split(Data)(selectIdx)
            Exit Function
        End If
    Next
End Function

こんな感じになるかな?

投稿時間:2004/07/23(Fri) 14:59
投稿者名:ライオンマスク
Eメール:
URL :
タイトル:
また教えてほしいのですが
りっとっとさん、ありがとうございます。
できればさらに教えてほしいのですが、

先ほどの物を左フレームの「ファイル操作関係」の「テキストファイル(TXT・CSV)の読込・書込み」の
「2.テキストファイル(CSV形式)を変数毎に読み書きする」のようにしたいのです。
データのほうは上のほうに空のデータがあり、

国語,90,,
数学,75,65,
社会,84,76,52
理科,72,89,41
英語,66,45,96

のような形になのですが、このようなときにもできるのでしょうか?
ご苦労かけますが、よろしくお願いします。

投稿時間:2004/07/23(Fri) 17:58
投稿者名:りっとっと
Eメール:
URL :
タイトル:
Re: また教えてほしいのですが
あまりいい方法が思い浮かびませんね。
ADOなどを使用する方法をお勧めいたします。
自作関数などですと、ファイルサイズが大きくなるとその分処理に時間がかかりますからね。
あと、逆引きに載っている方法が一番スマートだと思われますが、
一応前回のを改良したものをのせます。
.frmファイルの内容を全部載せますので、メモ帳を開きコピペして、"xxx.frm"として保存してください。あとは、新規プロジェクトで、保存したfrmファイルを追加し、スタートアップに設定して実行
してみてください。

'frmファイルの内容
VERSION 5.00
Begin VB.Form frmCSVSample
   Caption         =   "CSVファイルの読み込み修正サンプル"
   ClientHeight    =   2115
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   3870
   LinkTopic       =   "Form1"
   ScaleHeight     =   2115
   ScaleWidth      =   3870
   StartUpPosition =   3  'Windows の既定値
   Begin VB.TextBox txtKamoku
      Height          =   270
      Left            =   840
      TabIndex        =   4
      Top             =   120
      Width           =   2055
   End
   Begin VB.TextBox txtRireki
      Height          =   270
      Index           =   2
      Left            =   840
      TabIndex        =   3
      Top             =   1320
      Width           =   2055
   End
   Begin VB.TextBox txtRireki
      Height          =   270
      Index           =   1
      Left            =   840
      TabIndex        =   2
      Top             =   960
      Width           =   2055
   End
   Begin VB.TextBox txtRireki
      Height          =   270
      Index           =   0
      Left            =   840
      TabIndex        =   1
      Top             =   600
      Width           =   2055
   End
   Begin VB.CommandButton cmdHozon
      Caption         =   "保存"
      Height          =   375
      Left            =   2160
      TabIndex        =   0
      Top             =   1680
      Width           =   735
   End
   Begin VB.Label Label2
      Caption         =   "科目"
      Height          =   255
      Left            =   480
      TabIndex        =   8
      Top             =   120
      Width           =   375
   End
   Begin VB.Label Label1
      Caption         =   "3回目"
      Height          =   255
      Index           =   2
      Left            =   360
      TabIndex        =   7
      Top             =   1320
      Width           =   495
   End
   Begin VB.Label Label1
      Caption         =   "2回目"
      Height          =   255
      Index           =   1
      Left            =   360
      TabIndex        =   6
      Top             =   960
      Width           =   495
   End
   Begin VB.Label Label1
      Caption         =   "1回目"
      Height          =   255
      Index           =   0
      Left            =   360
      TabIndex        =   5
      Top             =   600
      Width           =   495
   End
End
Attribute VB_Name = "frmCSVSample"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Data() As String
Private Buf() As String
Private csvFileName As String
Private Cnt As Long
Private Cnt2 As Long
Private Cnt3 As Long

'保存ボタンが押されたらファイルに保存します
Private Sub cmdHozon_Click()
    Open csvFileName For Binary As #1
    '改行コードをCrLfにしています。環境などに応じて変更してください
    Put #1, , Join(Data, vbCrLf)
    Close #1
End Sub

Private Sub Form_Load()
    Dim rCnt As Long
    
    csvFileName = "c:\test.csv"
    OpenCSV
    '初期表示データを国語とします
    txtKamoku.Text = "国語"
    Call ChangeKamoku(txtKamoku.Text)
End Sub

'CSVファイルを開きます
Private Sub OpenCSV()
    Dim bin() As Byte
    Dim strData As String
    
    Open csvFileName For Binary As #1
    ReDim bin(LOF(1) - 1)
    Get #1, , bin
    Close #1
    strData = StrConv(bin, vbUnicode)
    strData = Replace(strData, vbCrLf, vbLf)
    strData = Replace(strData, vbCr, vbLf)
    Data = Split(strData, vbLf)
End Sub

'設定された科目の点数を表示
Private Function ChangeKamoku(Kamoku As String)
    For Cnt = 1 To 3
        txtRireki(Cnt - 1).Text = GetData(txtKamoku.Text, Cnt)
    Next
End Function

'カンマ区切りの最初の部分が科目名で履歴が左から1回目、2回目...という前提とします
Private Function GetData(Kamoku As String, Optional Rireki As Long = -1) As String
    For Cnt2 = 0 To UBound(Data)
        If Data(Cnt2) = "" Then Exit For
        Buf = Split(Data(Cnt2), ",")
        If Buf(0) = Kamoku Then
            GetData = Buf(Rireki)
            Exit Function
        End If
    Next
End Function

'点数を修正します
Private Function UpdateData(Kamoku As String, Rireki As Long, Tensu As String) As String
    For Cnt = 0 To UBound(Data)
        If Data(Cnt) <> "" Then
            Buf = Split(Data(Cnt), ",")
            If Buf(0) = Kamoku Then
                Buf(Rireki) = Tensu
                Data(Cnt) = Join(Buf, ",")
                Exit For
            End If
        End If
    Next
End Function

'エンターキーが押されたら表示する点数を変更
Private Sub txtKamoku_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        Call ChangeKamoku(txtKamoku.Text)
    End If
End Sub

'リアルタイムに修正
Private Sub txtRireki_Change(Index As Integer)
    Call UpdateData(txtKamoku.Text, Index + 1, txtRireki(Index).Text)
End Sub

投稿時間:2004/07/24(Sat) 18:11
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: また教えてほしいのですが
処理件数が少なかったり、仕組みを理解するなら、新の掲示板の No.1586 No.1578 が
参考になるでしょう。