CSVのファイル操作について


  2006-04-26 19:28:34  No: 131124

今、Exelで作成したCSVファイルを読み込んで各変数にそれぞれの割り当てるプログラムを作成しているのですが、""を外した状態で値を取得できません。
どのようにしたら""を外した状態で変数に値を入れることが出来ますか?
どなたか分かる方がいましたら教えてください。
VB6を使用してプログラムを作成しています。


特攻隊長まるるう  2006-04-26 19:47:57  No: 131125

>各変数
主語が無い。何の?VB6の?

[VB6.0]では文字列を""ではさんで表現します。
例えば
  Me.Text1.Text = "あああ"
で、実際にテキストボックスに表示されるのは『あああ』
だけですけど、これは理解していますか?。
  Me.Text1.Text = 変数
と命令しても
> "あああ"
と出力されますか?その場合は現象を再現できる
サンプルコードを書き込んでください。


  2006-04-26 20:02:05  No: 131126

言葉足らずですみません。
現在、CSVファイルの"aaa","aaa"の「,」の部分毎に変数を分解するとこまでは出来るのです「""」が変数についたままになってしまいます。
ソースを見て何かアドバイスを頂ければ幸いです。
FileName = "Bcequ.csv"
    FileNo = FreeFile

        Open FileName For Input As #FileNo
''            If iRet > 0 Then
                Do Until EOF(FileNo)
                
                Line Input #1, ctemp
                s() = Split(ctemp, ",")
                
                ReDim Preserve bcequ(i) As String
                ReDim Preserve name1(i) As String
                ReDim Preserve name2(i) As String
                ReDim Preserve color(i) As String
''                Input #FileNo,bcequ(i), name1(i), name2(i), color(i)
                    For i = 0 To UBound(s)
                        
                        MsgBox s(i)
                    Next i
                i = 0
                Loop


Blue  2006-04-26 20:19:22  No: 131127

単純に両端の " を取るだけならば、
Mid$関数とLen関数を使えばできます。


  2006-04-26 20:26:12  No: 131128

できればやり方を書いていただけないでしょうか?


フェイク  2006-04-26 20:27:16  No: 131129

>現在、CSVファイルの"aaa","aaa"の「,」の部分毎に変数を分解するとこ
>までは出来るのです「""」が変数についたままになってしまいます。

メモ帳などでそのファイルを開いてみたらどうでしょう。
きっとファイルの中身自体"aaa"になっていると思います。
つまり読み方の問題ではなく、そのファイルの作成時の問題だと思います。
Print #FileNo, XXX とWrite #FileNo, XXX の違いを調べられたらいかが
ですか。


ぶぶ  2006-04-26 20:35:26  No: 131130

"aaa"となったデータをaaaとしたいだけならば
Blueさんから
>Mid$関数とLen関数を使えばできます。
とヒントがでています。
私も単純にとるのならば同じ意見です。

>できればやり方を書いていただけないでしょうか?
と言う前にまず、ヘルプで関数の意味を調べてみましたか?
ちなみにLeft$関数,Right$関数も一緒に調べてみてはいかがでしょう?


  2006-04-26 20:52:48  No: 131131

へんすの中身が空白になる場合もあり、文字列の長さも一定の長さじゃないのですが大丈夫なんですか?


Blue  2006-04-26 20:56:31  No: 131132

> 文字列の長さも一定の長さじゃないのですが
だから Len関数を使うのですよ。


  2006-04-26 21:07:23  No: 131133

Len関数は、文字列の長さを返すのは分かります。
Mid関数は、指定した文字数分の文字をかえすんですよね?


Blue  2006-04-26 21:15:19  No: 131134

> 指定した文字数分
は 現在の文字数-2 ですよね?
(前の"で1文字、後の"で1文字で計2文字文字数が減るだけ)


特攻隊長まるるう  2006-04-26 21:21:58  No: 131135

そもそも
>Excelで作成したCSVファイル
ってとこにいろいろ問題があって、""ではさまれる場合には
『データ中にカンマ(,)を含む』というのがあって、
>                s() = Split(ctemp, ",")
じゃダメな気がするけど…ま、誰もつっこんでないし
質問文のメインになってないからいいか(^^;)


VB梅  2006-04-26 21:56:08  No: 131136

>どのようにしたら""を外した状態で変数に値を入れることが出来ますか?

外した状態で変数に入れるには「ctemp」変数内の["]を見つけて消す必要が有ります。
また、構文のInsが0になるまで繰り返す必要があります。

Ins = InStr(ctemp, """")
ctempd = Hex(Left(ctemp, Ins - 1))
ctemp = ctempd & Mid(ctemp, Ins + 1, (Len(Mid(ctemp, Ins + 1))))

こんな感じかな・・・動作確認してないのでチェックしてね

また、Splitで分解後の変数に入れた後の処理は
Private Sub test1()
Dim Name As String
Dim Named As String

Name = """ダブルクォーテーション"""

If Left(Name, 1) = """" Then
    Name = Mid(Name, 2, Len(Name) - 2)
End If
msgbox Name
End Sub

又は、

Private Sub test2()
Dim Name As String
Dim Named As String

Name = Chr(&H22) & "ダブルクォーテーション" & Chr(&H22)

If Left(Name, 1) = Chr(&H22) Then
    Name = Mid(Name, 2, Len(Name) - 2)
End If
msgbox Name
End Sub

"は""""で文字列に表す事出来るし、Chr(&H22)でも良いし
少し、勉強してね^^

動作確認してないので、ミスがあったらごめんね・・


VB梅  2006-04-26 21:59:59  No: 131137

ごめん^^;
Ins = InStr(ctemp, """")
ctempd = Left(ctemp, Ins - 1)
ctemp = ctempd & Mid(ctemp, Ins + 1, (Len(Mid(ctemp, Ins + 1))))

ctempd = Hex(Left(ctemp, Ins - 1))

ctempd = Left(ctemp, Ins - 1)

Hex()は余計でした・・・


  2006-04-26 23:58:57  No: 131138

動作確認済みですか?


通りすがり  2006-04-27 00:11:14  No: 131139

>こんな感じかな・・・動作確認してないのでチェックしてね
というメッセージを読んでいれば、
>動作確認済みですか?
という発言は出ないはずですが?


いな  2006-04-27 00:13:34  No: 131140

動作確認済みですか?
>動作確認してないので、ミスがあったらごめんね・・

だそうです。


  2006-04-27 00:35:24  No: 131141

修正版が入ってるんですけど・・


VB梅  2006-04-27 01:16:40  No: 131142

確認する意思も無いのならやめろ!
質問もするな!
ガキなら許すがな

HEX()があったのは、俺の作成したプログラムで
通信データBDCを時刻表示するのに使用していただけ
BDCもわからんと思うがな

要するに、使用していたプログラムをそのままコピペしただけだ
もともと動いていたのだから、動く動かないもあるか!
HEX()が有ると、文字列ではエラーが出るので修正した。

Private Sub test1()
Private Sub test2()
は動作確認済みだ

以上


通りすがり  2006-04-27 01:16:52  No: 131143

>修正版が入ってるんですけど・・

ど・・・?なに?
動作確認済みです。という回答がされたら、
そのままコピペして終わり?
自分では動作確認しないの?


ぶぶ  2006-04-27 07:52:08  No: 131144

ここまで、回答もらって動作確認済みかどうかというのはいかがなものでしょう?
まず、自分で確かめる気持ちがなかったら、プログラムなんてできないですよ。ずっと人に作ってもらうつもりですか?
それとも確認の仕方わかりませんか?


LESIA  2006-04-27 18:12:13  No: 131145

自作の拡張Split関数です。""を自動的に取り、データなかのカンマも有効です。
一応テストはしてますが充分ではありません(^^;

Option Explicit

Private Sub Command1_Click()
    Dim strFileName As String
    Dim iFileNo As Integer
    Dim strBuffer As String
    Dim s() As String
    Dim i As Integer
    
    strFileName = "c:\test\sample.csv"
    iFileNo = FreeFile

    Open strFileName For Input As #FileNo
        Do Until EOF(FileNo)
            Line Input #1, strBuffer
            s() = SplitCSV(strBuffer)
            For i = 0 To UBound(s)
                MsgBox s(i)
            Next i
        Loop
    Close #iFileNo
End Sub

Function SplitCSV(strData As String) As String()
    Dim flgDoubleQuote As Boolean
    Dim strDelimiter1 As String
    Dim strDelimiter2 As String
    Dim lngStartPos As Long
    Dim lngEndPos As Long
    Dim strBuffer() As String
    Dim i As Long
    Dim n As Long

    strDelimiter1 = ","
    strDelimiter2 = vbTab

    '引用符内のカンマ以外をタブに置き換える
    n = 0
    flgDoubleQuote = False
    For i = 1 To Len(strData)
        If Mid$(strData, i, 1) = Chr$(34) Then
            flgDoubleQuote = Not flgDoubleQuote
        End If

        If Mid$(strData, i, 1) = strDelimiter1 Then
            If flgDoubleQuote = False Then
                n = n + 1
                Mid$(strData, i, 1) = strDelimiter2
            End If
        End If
    Next i

    ReDim strBuffer(n)

    '文字列をタブで分離して配列にセット
    lngStartPos = 1
    For i = 0 To n
        If i = n Then
            lngEndPos = Len(strData)
        Else
            lngEndPos = InStr(lngStartPos, strData, strDelimiter2) - 1
        End If

        strBuffer(i) = Trim$(Mid$(strData, lngStartPos, lngEndPos - lngStartPos + 1))

        'ダブルクォーテーションを取る
        If strBuffer(i) Like """*""" Then
            strBuffer(i) = Mid$(strBuffer(i), 2, Len(strBuffer(i)) - 2)
        End If

        '次の開始位置
        lngStartPos = InStr(lngStartPos, strData, strDelimiter2) + 1
    Next i

    SplitCSV = strBuffer
End Function


あいうえお  2006-04-28 01:20:46  No: 131146

splitする前にreplace関数で何とかならない


VB梅  2006-04-28 02:01:21  No: 131147

ぎゃ〜〜〜〜〜っつ

あいうえおさん するどい!

VB6で
replace関数が使用できたのですね^^;

正規表現と一緒にVb.Netから実装されたのだと思っていました。

メモメモメモ_φ(._.φ(゜-゜;φ(._.φ(゜-゜;φ(._.φ(゜-゜;)カキカキカキ

今までVB6で組む場合、文字列から不要な文字を消去するのに時間のかかる処理をしていました。

ところで、質問者は何処に消えたの?


noname  2006-04-28 02:32:00  No: 131148

#これまた上手い運び方をする質問者がでてきたものですね・・・
#途中でボロがでちゃったみたいだけど^^;

私なら、とりあえず配列にでもCSVファイルから読み込んじゃって、
そこからループとIF文(そのときにMid関数を)で「"」の取り除き・・・かな。
初歩的な組み方になっちゃうけど、作りやすいし^^;

でも、あいうえお 氏の発言で・・・。
いや、私も思いつかなかったorz


noname  2006-04-28 02:32:05  No: 131149

#これまた上手い運び方をする質問者がでてきたものですね・・・
#途中でボロがでちゃったみたいだけど^^;

私なら、とりあえず配列にでもCSVファイルから読み込んじゃって、
そこからループとIF文(そのときにMid関数を)で「"」の取り除き・・・かな。
初歩的な組み方になっちゃうけど、作りやすいし^^;

でも、あいうえお 氏の発言で・・・。
いや、私も思いつかなかったorz


もげ  2006-04-28 02:58:56  No: 131150

データ内にカンマを含む場合と、
データの中にダブルコーテーションを含む場合は...地道にやるかな...

それ以外ならReplaceでOKなケースもあるかなと。


特攻隊長まるるう  2006-04-28 03:32:43  No: 131151

結局、仕様次第なんだよね。

Excel で保存する時に Excel メニューの保存を使わないで
マクロでデータ以外のダブルコーテーションが付かないように
CSVファイルを作るとか…。
『CSVファイルを扱うのにデータ中にカンマって在り得ないでしょ?』
って意見を受け付けてくれるなら、そもそも問題のあるCSVファイルを
作らなきゃいいんです。

文字列の置き換えだけの問題ならVBのコードだけの話でいいんだけど、
なんでダブルコーテーションが付いてるのか?全部のデータに付いてる
のか?...etc
十分に考えられていなければ、本当の意味で解決するはずの無い
質問です。


いな  2006-05-11 03:37:28  No: 131152

ぢつは、CSVのRFCは公開されています。
http://www.rfc-editor.org/rfc/rfc4180.txt

『CSVファイルを扱うのにデータ中にカンマって在り得ないでしょ?』
というのは、このRFC上で定義されている方法の記載を参考にすればよいと思う。

っていうかこの対処の仕方は、
今月の日経ソフトウェア(6月号)にアルゴリズムは乗って今います。


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

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






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