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件)
- 最新から表示
- 回答順に表示
No.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
No.4
- 回答日時:
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....ずつの列に分けていくなら、もっと簡単にできる)
No.3
- 回答日時:
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項目くらいになるかと思います。
難しいでしょうか?
No.2
- 回答日時:
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を設定、追加、をしましたら動くのがわかりました。
あとはプログラムがどのような動きをしているのかを理解してみます。
No.1
- 回答日時:
一行目の最後のところの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.初心者なので良くわかりませんが順読み(シーケンシャル?)のつもりです。
質問の内容にちゃんと回答出来ているかわかりませんがよろしくお願いいたします。
度々もうしわけございません。
c,1,2,3ですが、出力側で1件書込みが足りなくなるのはなぜでしょうか?
調べたり考えて見たのですがわかりませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Excel(エクセル) csvに別のExcelの文章を差し込む 2 2023/04/01 16:06
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
.txtではなく.logの方が良いの...
-
Windowsのバッチファイルを利用...
-
バッチファイルからVBAに引数を...
-
cshでファイルサイズ取得
-
ファイル内容の修正、行削除に...
-
forfilesで検索したファイルを...
-
エクセルの各セルの内容をそれ...
-
テキストファイルで提出とは?
-
VBSで、テキストファイルに対し...
-
【Excel】 VBAを使って毎回名前...
-
ファイルのワイルドカードについて
-
FTPコマンドでgetしたい
-
ファイルを処理中に次の処理に...
-
バッチにてフォルダ内ファイル...
-
renameコマンドについて
-
EXCEl/VBAで拡張子なしのファイ...
-
VBSで *.txt をサーバーにF...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報