アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB6初心者です。

例として下記のCSVファイルがあります。
a,1,2,3,4,5,b,1,2,3,4,5,6,c,1,2,3,c,1,2,3,c,1,2,3,c1,2,3
a,1,2,3,4,5,b,1,2,3,4,5,6,b,1,2,3,4,5,6,c,1,2,3,c,1,2,3,c,1,2,3,c,1,2,3,c,1,2,3c,1,2,3

上記を下記のように編集して別のCSVへ保存をしたのですがご教授ください。
a,1,2,3,4,5
b,1,2,3,4,5,6
c,1,2,3
c,1,2,3
c,1,2,3
c,1,2,3
a,1,2,3,4,5
b,1,2,3,4,5,6
b,1,2,3,4,5,6
c,1,2,3
c,1,2,3
c,1,2,3
c,1,2,3
c,1,2,3
c,1,2,3

上記の各a,b,c内の項目数は固定です。
a以降のb,c内の配列はランダムに複数となります。

A 回答 (5件)

こんにちは。



ちょっとみてみたけれども、前の回答者さんのコードがなければ、まったく分かりませんでした。

>a,1,2,3,4,5
>b,1,2,3,4,5,6
>b,1,2,3,4,5,6

実際に、a であるか、bであるか、cであるかの区切りサインは、70とか80の数字なのでしょうか、ご質問者さんのご指示がなかったので、#4さんのコードで参考にさせていただきました。

>実際は1行あたり200項目くらいになるかと思います。

#4さんの
>データベースがらみなら、もうちょっとスマートな方法が有りそうな気もするけど、、、
同感です。

本来、この種の擬似CSVの区切りコードは、別にあったような気がします。ただ、それは、ご質問者さん自身が、それに理解していないと作成の依頼自体が無理かもしれません。おそらく、データベース系の別のツールが存在するような気がします。

今は、PCには、もうVB6は入れていませんから、VBAで作りました。

*****適当に入れてください****

Sub Main() '←ここのプロシージャ名は無視してください。
 Dim myArray() As String '今回は、一応、String型
 Dim FileName As String
 Dim OutFile As String
 Dim textLine As String
 Dim Fno As Integer
 Dim oFno As Integer
 Dim buf As String
 Dim OutText As String
 Dim i As Long
 Dim j As Long
 FileName = "VBTEST.CSV" '入力ファイル名
 OutFile = "OVBTEST.CSV" '出力ファイル名
 Fno = FreeFile()
 Open FileName For Input As #Fno
 oFno = FreeFile()
 Open OutFile For Output As #oFno
 Do While Not EOF(Fno)
  Line Input #Fno, textLine
  myArray = Split(textLine, ",")
  ReDim Preserve myArray(UBound(myArray) + 1)
  OutText = "" '初期化
  j = 0
  For i = LBound(myArray) To UBound(myArray) - 1
   j = j + 1
   If j = 1 Then
    buf = myArray(i)
   Else
    buf = buf & "," & myArray(i)
   End If
   If IsNumeric(myArray(i + 1)) And myArray(i + 1) Like "#0" Then
    If OutText = "" Then
     OutText = buf
    Else
     OutText = OutText & vbCrLf & buf
    End If
    buf = ""
    j = 0
   End If
  Next i
  Print #oFno, OutText
  OutText = ""
 Loop
 Close #Fno
 Close #oFno
End Sub
    • good
    • 0

Private Sub Command1_Click()


Dim fso As New FileSystemObject
Dim ts As TextStream
Dim ts1 As TextStream
Set ts = fso.OpenTextFile("sample.txt", ForReading)
Set ts1 = fso.OpenTextFile("out.txt", ForWriting, True)
strtext = ""
Do
a = Split(ts.ReadLine, ",")
If UBound(a) = -1 Then Exit Do
For i = 0 To UBound(a) - 1
strtext = strtext & a(i) & ","
If IsNumeric(a(i + 1)) And Len(a(i + 1)) = 2 And Right(a(i + 1), 1) = "0" Then
Debug.Print Left(strtext, Len(strtext) - 1)
ts1.WriteLine Left(strtext, Len(strtext) - 1)
strtext = ""
End If
Next i
strtext = strtext & a(i)
Debug.Print strtext
ts1.WriteLine strtext
strtext = ""
Loop
ts.Close
ts1.Close
Set ts = Nothing
Set ts1 = Nothing
Set fso = Nothing
End Sub

ますますグチャグチャになってきたけど、動くには動くと思う。
改行のロジックは一応二桁の整数で10で割り切れるものにしている。

データベースがらみなら、もうちょっとスマートな方法が有りそうな気もするけど、、、
(一行が終わるまで、5,3,3,3....ずつの列に分けていくなら、もっと簡単にできる)
    • good
    • 0

fso1,参照設定等失礼しました。



ファイルが終わりになるまでのループを作り1行ずつで読んで、
forループで一文字ずつ見て、
その文字が0-9なら、toutの後ろ側にに格納、
カンマの場合、
次の文字が0-9でない場合toutを1行書き出し(toutをブランクにもどし)、
0-9の場合はカンマをtoutの後ろ側に書いて
next
loop

としています。

この回答への補足

解説有難うございます。
なんとなく動きについて理解しつつあります。

私の例が悪かったのですが、
60,4971159013646,キルトップリキッド,30mL,800.0,70,090,480.0,80,01,798.0,80,02,758.0,80,03,728.0,90,01,01,90,02,03,90,03,01,90,04,03
60,4971710429985,リップエッセンス,8g,600.0,70,070,360.0,70,077,358.0,80,01,630.0,80,02,598.0,90,01,01,90,02,01,90,03,02
のような商品マスタを
60,4971159013646,キルトップリキッド,30mL,800.0
70,090,480.0
80,01,798.0
80,02,758.0
80,03,728.0
90,01,01
90,02,03
90,03,01
90,04,03
60,4971710429985,リップエッセンス,8g,600.0
70,070,360.0
70,077,358.0
80,01,630.0
80,02,598.0
90,01,01
90,02,01
90,03,02
のように編集が理想です。
実際は1行あたり200項目くらいになるかと思います。
難しいでしょうか?

補足日時:2012/10/23 13:57
    • good
    • 0

Private Sub Command1_Click()


Dim fso As New FileSystemObject
Dim ts As TextStream
Dim ts1 As TextStream
Set ts = fso.OpenTextFile("sample.txt", ForReading)
Set ts1 = fso1.OpenTextFile("out.txt", ForWriting, True)
Do Until ts.AtEndOfStream
a = ts.ReadLine
tout = Left(a, 1)
For i = 1 To Len(a)
b = Asc(Mid(a, i, 1))
Select Case b
Case 48 To 57
tout = tout & Mid(a, i, 1)
Case 44
If Asc(Mid(a, i + 1, 1)) > 57 Then
ts1.WriteLine tout
tout = Mid(a, i + 1, 1)
Else
tout = tout & ","
End If
Case Else
Debug.Print Asc(Mid(a, i, 1))
End Select

Next i
Loop
ts.Close
ts1.Close
Set ts = Nothing
Set ts1 = Nothing
Set fso = Nothing
End Sub


非常に美しくないけど、とりあえず動くと思う。

この回答への補足

お世話になっております。

 参照設定と
 Dim fso1 As New FileSystemObjectと
 Set fso1 = Nothingと
 sample.txt
 out.txtを設定、追加、をしましたら動くのがわかりました。
あとはプログラムがどのような動きをしているのかを理解してみます。

補足日時:2012/10/23 13:01
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

本当にずぶの初心者なもので、現段階では理解が出来ませんが、
解読してみます・・・(-_-;)

お礼日時:2012/10/23 12:44

一行目の最後のところのc1,2,3


はc,1,2,3の間違いですか?
二行目の最後のところの3c,1,2,3
は3,c,1,2,3の間違いですか?
一行目の最後にはカンマはなく、crlfが入っているのですか?
アルファベットはa,b,cだけですか?
ファイルの全体のサイズはどのくらいになりますか?
どのような方法でファイルを読むつもりですか?

この回答への補足

ご指摘有難うございます。

一行目の最後のところのc1,2,3
はc,1,2,3の間違いですか?
 Ans.記述の間違いです。c,1,2,3となります。

二行目の最後のところの3c,1,2,3
は3,c,1,2,3の間違いですか?
 Ans.同じく記述の間違いです。3,c,1,2,3となります。

一行目の最後にはカンマはなく、crlfが入っているのですか?
 Ans.その通りとなります。(改行)

アルファベットはa,b,cだけですか?
 Ans.a,b,c,に関しましては編集後のレコード種別となり
   現段階では文字タイプ等は決まっておりません。

ファイルの全体のサイズはどのくらいになりますか?
 Ans.未定ですが1MB以内を想定しております。

どのような方法でファイルを読むつもりですか?
 Ans.初心者なので良くわかりませんが順読み(シーケンシャル?)のつもりです。

 質問の内容にちゃんと回答出来ているかわかりませんがよろしくお願いいたします。

補足日時:2012/10/23 12:22
    • good
    • 0
この回答へのお礼

度々もうしわけございません。

c,1,2,3ですが、出力側で1件書込みが足りなくなるのはなぜでしょうか?
調べたり考えて見たのですがわかりませんでした。

お礼日時:2012/10/23 13:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!