■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#21103-0ファイルの書き出しのタイミングについてmiho2002-06-10(月) 09:41
     #21105-0RE#21103:ファイルの書き出しのタイミングについてSay2002-06-10(月) 10:10
     #21106-0RE#21103:ファイルの書き出しのタイミングについてあき☆彡 2002-06-10(月) 10:13
     #21107-0RE#21106:ファイルの書き出しのタイミングについてmiho2002-06-10(月) 10:19
     #21108-0RE#21107:ファイルの書き出しのタイミングについてあき☆彡2002-06-10(月) 10:23
     #21109-0RE#21108:ファイルの書き出しのタイミングについてmoho2002-06-10(月) 10:33
     #21110-0RE#21109:ファイルの書き出しのタイミングについてあき☆彡2002-06-10(月) 10:50
     #21111-0RE#21110:ファイルの書き出しのタイミングについてmiho2002-06-10(月) 11:04
     #21112-0RE#21111:ファイルの書き出しのタイミングについてmiho2002-06-10(月) 11:24
     #21113-0RE#21112:ファイルの書き出しのタイミングについてあき☆彡2002-06-10(月) 11:33
     #21118-0RE#21113:ファイルの書き出しのタイミングについてmiho2002-06-10(月) 12:43
#21103-0
ファイルの書き出しのタイミングについて
入力ファイルから100行単位で!!出力ファイルに書き出す
など条件がある場合についてなのですが
仮に、実際は見ることが出来ません(どんな行数にも対応しなければならない)
が222行あったとします。
その場合、出力ファイル1に100行、出力ファイル2に100行
出力ファイル3に22行と出力したいのですが、
そのために100個分格納できる配列は準備したのですが
それ以降どうしてよいかわかりません。
m(__)m
初心者の質問ですみませんm(__)m
教えてください。
#21105-0
RE#21103:ファイルの書き出しのタイミングについて
単に100行単位で振り分け書き出しするだけなら、
配列いりません。
だいたいこんなかんじ

入力ファイルオープン
Do 入力ファイルエンドまで
    出力ファイル名作成
    出力ファイルオープン
    For 行カウンタ が 1 から 100 まで
        入力ファイルエンドならFor脱出
        入力ファイル1行読み出し
        加工が必要ならここで処理
        出力ファイル1行書き込み
    Next
    出力ファイルクローズ
Loop
入力ファイルクローズ
#21106-0
RE#21103:ファイルの書き出しのタイミングについて
> 入力ファイルから100行単位で!!出力ファイルに書き出す
> そのために100個分格納できる配列は準備したのですが
配列を用意しなくても出来ますよ。
入力ファイルを読みながら出力ファイルへ書き出す
(100行書き出したら出力ファイル名を変更)
とすれば良いと思います。

例えばこんなこんな感じとか・・・

Private Sub Command1_Click()
    Const SEP As Long = 100
    Dim iReadNo     As Integer
    Dim iWriteNo    As Integer
    Dim sBuff       As String
    Dim lNum        As Long
    Dim bWrite      As Boolean
    
    iReadNo = FreeFile
    Open "C:\test.txt" For Input As #iReadNo
    iWriteNo = FreeFile
    lNum = 0
    bWrite = False
    Do While Not EOF(iReadNo)
        Line Input #iReadNo, sBuff
        If lNum Mod SEP = 0 Then
            If bWrite Then Close #iWriteNo
            Open "C:\test" & CStr(lNum \ SEP + 1) & ".txt" For Output As #iWriteNo
            bWrite = True
        End If
        Print #iWriteNo, sBuff
        lNum = lNum + 1
    Loop
    If bWrite Then Close #iWriteNo
    Close #iReadNo
End Sub

#21107-0
RE#21106:ファイルの書き出しのタイミングについて
ご返答ありがとうございます。
配列にしたのには理由がありまして
配列に100個格納してそれを昇順にする
という処理を行いたかったからです。
配列を使った場合はどうなるのでしょうか?

ちなみに222行であるならば100で足りないかもしれませんが
2順目以降はその配列に上書きするつもりです。

つまり、1回目100行格納→それを昇順→出力ファイル1に書き出し
	2回目100行格納→それを昇順→出力ファイル2に書き出し
	3回目22行格納1→それを昇順→出力ファイル3に書き出し
としたいのですが、配列を使った場合
どのようにすれば良いのでしょうか?
#21108-0
RE#21107:ファイルの書き出しのタイミングについて
> 配列にしたのには理由がありまして
> 配列に100個格納してそれを昇順にする
> という処理を行いたかったからです。
> 配列を使った場合はどうなるのでしょうか?
配列でも処理が少し変わるだけで考え方は同じです。
考えてみて下さい。
又、ソートするのでしたら配列を使用するより
リストボックスを使った方が簡単だと思います。
#21109-0
RE#21108:ファイルの書き出しのタイミングについて
はい、勿論自分でも考えたのですがどうしても
分からず(3、4日考えました)このHPにきました。
ファイル処理は一度もやったこと無いので
どういうものか分からないので助けてください。
おっしゃる通り、下記にレスしてくださった方法は
分かるのですが配列と、書き出すタイミングがわからず
どのように記述してよいか分からない状態です。
(まだ、慣れてない為頭にある考えがコード化できません(T_T))

何卒宜しくお願いします。
m(__)m
#21110-0
RE#21109:ファイルの書き出しのタイミングについて
> はい、勿論自分でも考えたのですがどうしても
> 分からず(3、4日考えました)このHPにきました。
もう少しです。頑張ってみましょうo(^-^)o

> ファイル処理は一度もやったこと無いので
> どういうものか分からないので助けてください。
> おっしゃる通り、下記にレスしてくださった方法は
> 分かるのですが配列と、書き出すタイミングがわからず
書き出すタイミングはリストボックスの場合は
こんな感じに出来ます。( Sayさんのを元に書きましたm(_ _)m )
これをコードにしてみましょう。
分からない個所があれば、どの部分が分からないのか具体的に作成中のコードと一緒に投稿して下さい。


入力ファイルオープン
Do 入力ファイルエンドまで
    出力ファイル名作成
    出力ファイルオープン
    リストボックスクリア(clear)
    For 行カウンタ が 1 から 100 まで
        入力ファイルエンドならFor脱出
        入力ファイル1行読み出し
        リストボックスに追加(additem)
    Next
    for 行カウンタ が 0 から リストボックス.listcount-1 まで
        出力ファイルにlist(行カウンタ)を書き込み
    Next
    出力ファイルクローズ
Loop
入力ファイルクローズ
#21111-0
RE#21110:ファイルの書き出しのタイミングについて
レスありがとうございます。
リストボックスということでしたが
配列の勉強も踏まえて今勉強しているので
配列でお願いします。
m(__)m
以下に私のコード(出来たところまで)を書きます。

--------------------------------------以下
Private Sub cmdPlay_Click()
    
    FOpen = FreeFile
    Open txtInput.Text For Input As #FOpen
    
    FSave = FreeFile
    Open txtOutput.Text For Output As #FSave

    Call SubSort
    
    Close
    MsgBox "整列が終了しました!!"
End Sub

************ここから
Private Sub SubSort()
    Dim lngCount As Long
    
    Do Until EOF(FOpen) = True
        For lngCount = 1 To 100
            If EOF(FOpen) = True Then
                Exit For
            End If
            Line Input #FOpen, strWord(lngCount)
                If lngCount = 100 Then
                    Total = lngCount
                End If
                
            Call SubASC
            
        Next lngCount
        If EOF(FOpen) = True Then
            Total = lngCount
        End If
    Loop
End Sub
***************ここまでの書き方が分からないです。(T_T)


*****以下の処理は分かります。
'昇順の処理
Private Sub SubASC()
    Dim m As Long
    Dim n As Long
    Dim Min As String
    Dim i As Long

    For m = 1 To Total - 1
        For n = m + 1 To Total
            If strWord(m) > strWord(n) Then
                Min = strWord(n)
                strWord(n) = strWord(m)
                strWord(m) = Min
            End If
        Next n
    Next m
    
    For i = 1 To Total
        Print #FSave, strWord(i)
    Next i
End Sub
#21112-0
RE#21111:ファイルの書き出しのタイミングについて
さらに分からない個所追加です。m(__)m
レスに書いてくださってましたが
ファイル名を100行ごとに変えて出力したいのですが
その方法がコードを見たのですが
良く分からないです。
Printしている所を変えれば良いのですか?
教えてください。
#21113-0
RE#21112:ファイルの書き出しのタイミングについて
> ファイル名を100行ごとに変えて出力したいのですが
> その方法がコードを見たのですが
> 良く分からないです。
こんな感じに修正したら良いかと・・・

************ここから
Private Sub SubSort()
    Dim lngCount As Long
    
    '@@@読み込みファイルのオープン
    Do Until EOF(FOpen) = True
        '@@@ここで出力ファイル名を編集してOPEMしないと100行毎に出力できないのでは?
        '@@@カウントクリア Total = 0
        '@@@配列クリア erase strWord
        For lngCount = 1 To 100
            If EOF(FOpen) = True Then   '(1)
                Exit For                '(1)
            End If                      '(1)
            Line Input #FOpen, strWord(lngCount)
            '@@@ここで出力データ数をカウントする Total = Total + 1
            '@@@EOFのチェックはデータ取得後行った方が・・・((1)の処理をここに)
            If lngCount = 100 Then  '不要
                Total = lngCount    '不要
            End If                  '不要
            Call SubASC             '不要 1件読む毎に呼ぶ必要はない
        Next lngCount
        '@@@ここで【SubASC】を呼ぶ(SubASC内ではソートのみ行った方が良いのでは?)
        '@@@配列データ出力
        '@@@出力ファイルクローズ
        If EOF(FOpen) = True Then   '不要
            Total = lngCount        '不要
        End If                      '不要
    Loop
    '@@@読込みファイルクローズ
    
End Sub
***************ここまでの書き方が分からないです。(T_T)
#21118-0
RE#21113:ファイルの書き出しのタイミングについて
>'@@@ここで出力ファイル名を編集してOPEMしないと100行毎に出力できないのでは?

との事ですが確かにその通りです。
どのように出力モードでオープンしてあげれば
ファイル名が変わるのでしょうか?
このページと関連する記事:
#20915-02つ目2002-05-24(金) 00:52
#21072-0RE#21066:マージ処理について2002-06-06(木) 13:48
#34824-0Do...Loopステートメントについて2000-12-06(水) 16:54
#8452-0String変数を決められた数だけ宣言2000-06-01(木) 12:51
#8571-0リストボックスの中身を順次ファイルに出力するには2000-03-15(水) 15:19
#33599-0ファイルの読み込みについて2000-11-16(木) 18:21
#21065-0マージ処理について2002-06-06(木) 09:01
#1449-2listviewについて2001-11-13(火) 02:15
#8151-0Openステートメントについて2000-05-20(土) 18:31
#145-1ファイルシステムコントロ−ルの活用2003-12-05(金) 23:05
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)