- 締切済み
CSV編集について(VB6)
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内の配列はランダムに複数となります。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 ちょっとみてみたけれども、前の回答者さんのコードがなければ、まったく分かりませんでした。 >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
- ShowMeHow
- ベストアンサー率28% (1424/5027)
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....ずつの列に分けていくなら、もっと簡単にできる)
- ShowMeHow
- ベストアンサー率28% (1424/5027)
fso1,参照設定等失礼しました。 ファイルが終わりになるまでのループを作り1行ずつで読んで、 forループで一文字ずつ見て、 その文字が0-9なら、toutの後ろ側にに格納、 カンマの場合、 次の文字が0-9でない場合toutを1行書き出し(toutをブランクにもどし)、 0-9の場合はカンマをtoutの後ろ側に書いて next loop としています。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
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を設定、追加、をしましたら動くのがわかりました。 あとはプログラムがどのような動きをしているのかを理解してみます。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
一行目の最後のところのc1,2,3 はc,1,2,3の間違いですか? 二行目の最後のところの3c,1,2,3 は3,c,1,2,3の間違いですか? 一行目の最後にはカンマはなく、crlfが入っているのですか? アルファベットはa,b,cだけですか? ファイルの全体のサイズはどのくらいになりますか? どのような方法でファイルを読むつもりですか?
お礼
度々もうしわけございません。 c,1,2,3ですが、出力側で1件書込みが足りなくなるのはなぜでしょうか? 調べたり考えて見たのですがわかりませんでした。
補足
ご指摘有難うございます。 一行目の最後のところの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.初心者なので良くわかりませんが順読み(シーケンシャル?)のつもりです。 質問の内容にちゃんと回答出来ているかわかりませんがよろしくお願いいたします。
補足
解説有難うございます。 なんとなく動きについて理解しつつあります。 私の例が悪かったのですが、 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項目くらいになるかと思います。 難しいでしょうか?