■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#21072-0RE#21066:マージ処理についてtakako2002-06-06(木) 13:48
     #21074-0RE#21072:マージ処理についてtakako2002-06-06(木) 14:32
     #21075-0RE#21074:マージ処理について2002-06-06(木) 15:04
     #21077-0RE#21075:マージ処理についてtakako2002-06-06(木) 15:35
     #21079-0RE#21075:マージ処理について2002-06-06(木) 15:51
     #21080-0RE#21079:マージ処理についてtakako2002-06-06(木) 16:03
     #21082-0RE#21080:マージ処理について2002-06-06(木) 16:41
#21072-0
RE#21066:マージ処理について
ありがとうございました。
私の説明不足でした。

出力ファイルへの書き出し方は
File1の1行目とFile2の1行目を見比べて
File1の1行目<File2の1行目ならば

File1の1行目
File2の1行目
・・・・・・・
となり

File1の1行目>File2の1行目ならば
File2の1行目
File1の1行目
・・・・・・・

となります。これをEOFまで繰り返します。

あと、先ほど動的配列という案がメモリを食わなくていいという
事でしたが動的配列について良く分からないのでお願いします。
m(__)m
#21074-0
RE#21072:マージ処理について
色々とご教授ありがとうございます。
私なりに作ってみたのですが出力すると
UBoundの中のプリントから変な改行が入るのですが
これを直したいのですがどうしたら良いでしょうか?
超初心者のため何やってんだこいつ、みたいな
プログラムでしょうがどうしたらよいか教えてください。
m(__)m

以下私のツタナイプログラム
    Do Until Count1 > Total1 And Count2 > Total2
            If strWord1(Count1) >= strWord2(Count2) Then
                Print #FSave, strWord2(Count2)
                Print #FSave, strWord1(Count1)
            ElseIf strWord1(Count1) < strWord2(Count2) Then
                Print #FSave, strWord1(Count1)
                Print #FSave, strWord2(Count2)
            ElseIf strWord1(Count1) = EOF(FOpen1) Then
                Upper1 = UBound(strWord2, 1)
                Do Until Upper1 = strWord2(Count2)
                    Print #FSave, strWord2(Count2)
                Loop
            ElseIf strWord2(Count2) = EOF(FOpen2) Then
                Upper2 = UBound(strWord1, 1)
                Do Until Upper2 = strWord1(Count1)
                    Print #FSave, strWord1(Count1)
                Loop
            End If
        Count1 = Count1 + 1
        Count2 = Count2 + 1
    Loop
#21075-0
RE#21074:マージ処理について
> 色々とご教授ありがとうございます。
> 私なりに作ってみたのですが出力すると
> UBoundの中のプリントから変な改行が入るのですが
> これを直したいのですがどうしたら良いでしょうか?

>     Do Until Count1 > Total1 And Count2 > Total2
>             If strWord1(Count1) >= strWord2(Count2) Then
>                 Print #FSave, strWord2(Count2)
>                 Print #FSave, strWord1(Count1)
>             ElseIf strWord1(Count1) < strWord2(Count2) Then
>                 Print #FSave, strWord1(Count1)
>                 Print #FSave, strWord2(Count2)
>             ElseIf strWord1(Count1) = EOF(FOpen1) Then
>                 Upper1 = UBound(strWord2, 1)
>                 Do Until Upper1 = strWord2(Count2)
>                     Print #FSave, strWord2(Count2)
>                 Loop
>             ElseIf strWord2(Count2) = EOF(FOpen2) Then
>                 Upper2 = UBound(strWord1, 1)
>                 Do Until Upper2 = strWord1(Count1)
>                     Print #FSave, strWord1(Count1)
>                 Loop
>             End If
>         Count1 = Count1 + 1
>         Count2 = Count2 + 1
>     Loop

デバッグウインドウなどで確認すると判りますが、UBoundの戻り値はLongです。
    Do Until Upper1 = strWord2(Count2)
は、「UBound(strWord2, 1)とstrWord2(Count2)が一致するまで」という
意味ですから、たまたまstrWord2(Count2)が数字でUBound(strWord2, 1)と
同じ値になっていない限り終わらないでしょう。
ですからここでは
                 Do Until Upper1 = Count2
                     Print #FSave, strWord2(Count2)
                     Count2 = Count2 + 1
                 Loop
が正解かな?
もちろんstrWord1についても同様。

#あと動的配列についてはヘルプでReDimステートメントを参照して下さい。
#21077-0
RE#21075:マージ処理について
たびたびありがとうございます。
m(__)m

教えていただいた通り直したのですがやはり1行出力するごとに
UBound以下が一つ改行され、空白行ができ、1行出力、空白行…
という感じです。
なぜなのか原因がわかりません(T_T)
助けてくださいm(__)m
ちなみにUpper1、2は何型なのでしょうか?


Private Sub SubMarge()
    Dim Count1 As Long, Count2 As Long
    Dim Total1 As Long, Total2 As Long
    
    
    'FOpen1の行数をカウント&全部で何行か
    Count1 = 1
    Do Until EOF(FOpen1) = True
        Line Input #FOpen1, strWord1(Count1)
        Count1 = Count1 + 1
    Loop
    Total1 = Count1 - 1

    'FOpen2の行数をカウント&全部で何行か
    Count2 = 1
    Do Until EOF(FOpen2) = True
        Line Input #FOpen2, strWord2(Count2)
        Count2 = Count2 + 1
    Loop
    Total2 = Count2 - 1


    'マージ処理
    Count1 = 1
    Count2 = 1
    Do Until Count1 > Total1 And Count2 > Total2
            If strWord1(Count1) >= strWord2(Count2) Then
                Print #FSave, strWord2(Count2)
                Print #FSave, strWord1(Count1)
                Count1 = Count1 + 1
                Count2 = Count2 + 1

            ElseIf strWord1(Count1) < strWord2(Count2) Then
                Print #FSave, strWord1(Count1)
                Print #FSave, strWord2(Count2)
                Count1 = Count1 + 1
                Count2 = Count2 + 1

            ElseIf strWord1(Count1) = EOF(FOpen1) Then
                Upper1 = UBound(strWord2, 1)
                Do Until Upper1 = Count2
                    Print #FSave, strWord2(Count2)
                    Count2 = Count2 + 1
                Loop
            ElseIf strWord2(Count2) = EOF(FOpen2) Then
                Upper2 = UBound(strWord1, 1)
                Do Until Upper2 = Count1
                    Print #FSave, strWord1(Count1)
                    Count1 = Count1 + 1
                Loop
            End If
    Loop
End Sub
#21079-0
RE#21075:マージ処理について
って、またやった......(^^;
#いえ、私が早とちりだってことなんです。

まず、
> >             If strWord1(Count1) >= strWord2(Count2) Then
> >             ElseIf strWord1(Count1) < strWord2(Count2) Then
> >             ElseIf strWord1(Count1) = EOF(FOpen1) Then
> >             ElseIf strWord2(Count2) = EOF(FOpen2) Then
これらは評価基準が違うので、できればElseIfで並べないほうがいいです。
また、EOFの戻り値はBooleanですから、上記の下2行は、あえて書くなら
             ElseIf EOF(FOpen1) = True Then
             ElseIf EOF(FOpen2) = False Then
です。

で、たとえば私ならこう書く、という意味ではこんな感じですね。
#即興で作ったんで、まだまだ荒いですけど。

Do
    If Count1 >= UBound(strWord1) Then
        Do Until Count2 >= UBound(strWord2)
            Print #FSave, strWord2(Count2)
            Count2 = Count2 + 1
        Loop
        Exit Do
    ElseIf Count2 >= UBound(strWord2) Then
        Do Until Count1 >= UBound(strWord1)
            Print #FSave, strWord1(Count1)
            Count1 = Count1 + 1
        Loop
        Exit Do
    Else
        If strWord1(Count1) >= strWord2(Count2) Then
            Print #FSave, strWord2(Count2)
            Print #FSave, strWord1(Count1)
        ElseIf strWord1(Count1) < strWord2(Count2) Then
            Print #FSave, strWord1(Count1)
            Print #FSave, strWord2(Count2)
        End If
    End If
    Count1 = Count1 + 1
    Count2 = Count2 + 1
Loop

#21080-0
RE#21079:マージ処理について
たびたびありがとうございます。
m(__)m
教えていただいたプログラムでも実行は出来、そして性格に書き出されるのですが
やはり改行が入ってしまいます。
これを除去どうしてもしたいのですがこれって何なんですか?

対処法をお願い致します。
m(__)m
#21082-0
RE#21080:マージ処理について
> 教えていただいたプログラムでも実行は出来、そして性格に書き出されるのですが
> やはり改行が入ってしまいます。
> これを除去どうしてもしたいのですがこれって何なんですか?

多分、strWord1, strWord2は、十分に大きな要素数の配列をあらかじめ
宣言しているんだと思いますが、これだとUBoundによる判断が出来ません。
そのため#21075で示したコードでは、必ずElse節に入ってしまうんでしょう。
でも片方のTotalを超えたところは空文字列ですから、Printでは改行のみが
ファイルに書き出されます。
これが空白行の正体です。

参考までに、カウンタを使用しないコードの例を。

Public Sub SubMarge(ByVal Infile1 As String, ByVal Infile2 As String, _
        ByVal SaveFile As String)
    Dim fNum1 As Integer, fNum2 As Integer, OutNum As Integer
    Dim strTemp1 As String, strTemp2 As String
    
    fNum1 = FreeFile
    Open Infile1 For Input As fNum1
    fNum2 = FreeFile
    Open Infile2 For Input As fNum2
    OutNum = FreeFile
    Open SaveFile For Output As OutNum
    
    Do
        Line Input #fNum1, strTemp1
        Line Input #fNum2, strTemp2
        If strTemp1 < strTemp2 Then
            Print #OutNum, strTemp2
            Print #OutNum, strTemp1
        ElseIf strTemp1 >= strTemp2 Then
            Print #OutNum, strTemp1
            Print #OutNum, strTemp2
        End If
        If EOF(fNum1) = True Then
            Do Until EOF(fNum2)
                Line Input #fNum2, strTemp2
                Print #OutNum, strTemp2
            Loop
            Exit Do
        ElseIf EOF(fNum2) = True Then
            Do Until EOF(fNum1)
                Line Input #fNum1, strTemp1
                Print #OutNum, strTemp1
            Loop
            Exit Do
        End If
    Loop
    Close #fNum1
    Close #fNum2
    Close #OutNum
    
End Sub

このページと関連する記事:
#20921-0ファイル操作の基礎(~_~;)2002-05-24(金) 13:38
#21103-0ファイルの書き出しのタイミングについて2002-06-10(月) 09:41
#8149-0テキストファイルの・・・2000-05-20(土) 17:56
#34824-0Do...Loopステートメントについて2000-12-06(水) 16:54
#8151-0Openステートメントについて2000-05-20(土) 18:31
#145-1ファイルシステムコントロ−ルの活用2003-12-05(金) 23:05
#20914-02つの質問。2002-05-24(金) 00:47
#5713-0Mid関数について1999-12-15(水) 18:09
#33599-0ファイルの読み込みについて2000-11-16(木) 18:21
#16547-0複数の文字列抽出法について2001-06-07(木) 18:30
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)