[[20150427163551]] 『複数のテキストファイルを1つにする』(TOTO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数のテキストファイルを1つにする』(TOTO)

4つのテキストデータを取得し、それを1つのテキストファイルに
保存する事は可能でしょうか?
テキストファイルの項目名は4つとも同じですが、
行数は取得都度異なります。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 4つのテキストデータはテキストファイルでしょうか。
 一つのブック内の4シートでしょうか。
 それとも4つの EXCEL ファイルでしょうか。
(Mook) 2015/04/27(月) 16:43

こんにちは

それぞれ項目名が有るという事は

コマンドプロンプトで、

C*\> copy aaa.txt + bbb.txt zzz.txt

とかではダメって事ですよね?

(ウッシ) 2015/04/27(月) 16:45


4つともテキストファイルです。
無知のため噛み砕いてご教授願います。
(TOTO) 2015/04/27(月) 16:55

 ウッシさんの質問は、単純に二つのファイルの中身をくっつけた場合、
 タイトル行が途中に入るからダメなのかどうか。
 ということを確認したいコメントなのですが、その点はどうなのでしょうか。

 また、EXCEL とはまったく関係無いところの処理でも良いのでしょうか。
 ファイル名が毎回固定で、タイトル行の重複が問題ないのであれば、
 ウッシさんのコマンドをバッチにすれば出来そうですけれど。

(Mook) 2015/04/27(月) 19:05


 私も ウッシさん、Mookさんの提案に賛成です。
 余分なタイトル行は、メモ帳等で開いて削除すれば、あっというまでしょうし。

(β) 2015/04/27(月) 19:20


 おじゃまします。
 こんなふうに Get#, Put# を繰り返したらどうでしょう?
 (2ファイル目から 一行目は読み飛ばして、 Put# しています)

 Public Sub trial()
  Dim txtFiles
  Dim joinFile
    '結合する 元のテキストファイルを CtrlやShiftを使って選択
    txtFiles = Application.GetOpenFilename("Text,*.txt;*.csv", MultiSelect:=True)
    If Not IsArray(txtFiles) Then Exit Sub

    '結合後のファイル名
    joinFile = Application.GetSaveAsFilename("Join.txt")
    If VarType(joinFile) = vbBoolean Then Exit Sub

    JoinTextFiles txtFiles, joinFile
 End Sub

 Private Sub JoinTextFiles(fArray, fTarget)
  Dim buf() As Byte
  Dim f
  Dim b&, k&, io%, oo%
  Dim ss As String
    oo = FreeFile()
    Open fTarget For Binary Access Write As oo

    io = FreeFile()
    For Each f In fArray
        If k > 0 Then
            Open f For Input As io
            Line Input #io, ss 'ヘッダ行1行読み込み
            b = Seek(io)
            Close io
        Else
            b = 1
            k = 1
        End If
        Open f For Binary Access Read As io
        ReDim buf(b To LOF(io))
        Get #io, b, buf
        Close io
        Put #oo, , buf
    Next
    Close oo
    MsgBox "結合しました", , fTarget
 End Sub
 .
(kanabun) 2015/04/27(月) 20:33

 どうしたいか詳細の回答を待っていましたが、kanabun さんからマクロ案も出たので、
 とりあえずのVBS 案です。

 下記をメモ帳に貼り付け、結合.vbs の名前でデスクトップにでも保存してから、
 結合したいドキュメントをすべて選択して「まとめて」結合.vbs へドロップしてください。

 先頭のファイルと、2番目以降は2行目以降を結合したファイルが *_ALL.txt 等の名前で
 生成されると思います。

 Set fso = CreateObject("Scripting.FileSystemObject")
 Set dstFile = fso.CreateTextFile( Replace( WScript.Arguments(i), ".", "_ALL." ), True ) 
 For i=0 To WScript.Arguments.Count - 1 
    txt = fso.OpenTextFile( WScript.Arguments(i) ).ReadAll() 
    If i = 0 Then pos = 1 Else pos = InStr( txt, vbNewLine ) + 1 
    dstFile.Write Mid( txt, pos, Len( txt ) ) 
 Next 
 dstFile.Close

 先の条件でよければ、
 Copy %1 + %2 + %3 + %4  All.txt
 という一行のバッチを 結合.bat というよう作って、そこにファイルをドロップすれば、
 All.txt が出来ると思うので、こちらの方がお手軽ですけれど。

(Mook) 2015/04/27(月) 20:52


返信が遅くなりました。

ウッシさんの質問は、単純に二つのファイルの中身をくっつけた場合、
タイトル行が途中に入るからダメなのかどうか。
ということを確認したいコメントなのですが、その点はどうなのでしょうか。

→タイトルは毎回固定にします

また、EXCEL とはまったく関係無いところの処理でも良いのでしょうか。
ファイル名が毎回固定で、タイトル行の重複が問題ないのであれば、
ウッシさんのコマンドをバッチにすれば出来そうですけれど。

→エクセルと関係なくても大丈夫です。
 バッチでも・・マクロでも。

しかし、kanabunさん、Mookさんからいただいたコメントを見て
固まっています。

(TOTO) 2015/04/28(火) 14:19


→タイトルは毎回固定にします

回答間違えました。
タイトルは重複すると困るので2行目から一番下までを合体したいです。
(TOTO) 2015/04/28(火) 14:42


 よこから失礼します。

 >しかし、kanabunさん、Mookさんからいただいたコメントを見て 
 >タイトルは重複すると困るので2行目から一番下までを合体したいです。

 kanabunさんのVBA,MookさんのVBSともに、選択したテクストファイルを2つめ以降のタイトル行をのぞいて結合していますよ?

 固まる前に、実際にやってみられたらいかがでしょうか?

 ただ、kanabunさんの例では、どれが先頭ファイルかの指定ができず、エクスプローラ上で上にあるもの、(名前が若いもの)が
 先頭になると思われますが、いずれのファイルにもタイトル行があるわけですから、いいですよね。

(β) 2015/04/28(火) 15:14


 kanabunさんのコード、そっくりそのままで、テキストファイルの選択を複数一挙ではなく1つずつにしたものです。
 選択が終われば、キャンセルボタンをおします。
 選択した順序にしたがってファイルが結合されます。

 JoinTextFiles は変更有りません。そのまま使います。

 Public Sub trial2()
  Dim fPath
  Dim txtFiles
  Dim joinFile
    '結合する 元のテキストファイルを選択
    Do
        fPath = Application.GetOpenFilename("Text,*.txt;*.csv")
        If fPath = False Then Exit Do
        If IsArray(txtFiles) Then
            ReDim Preserve txtFiles(1 To UBound(txtFiles) + 1)
        Else
            ReDim txtFiles(1 To 1)
        End If
        txtFiles(UBound(txtFiles)) = fPath
    Loop

    If Not IsArray(txtFiles) Then Exit Sub

    If MsgBox("以下の順番でファイルを結合します。よろしいですか?" & vbLf & Join(txtFiles, vbLf), vbYesNo) = vbNo Then Exit Sub

    '結合後のファイル名
    joinFile = Application.GetSaveAsFilename("Join.txt")
    If VarType(joinFile) = vbBoolean Then Exit Sub

    JoinTextFiles txtFiles, joinFile
 End Sub

(β) 2015/04/28(火) 15:28


すみませんVBA、VBS、バッチファイルを1回も作った事がないので 
チャレンジはしたのですがエラーとなってしまいます。
もう少しやってみます。

ちなみに、
4つのテキストファイルを合算した後、
続けてマクロでデータ加工予定です。

(TOTO) 2015/04/28(火) 15:37


コンパイルエラー 
SubまたはFunctionが定義されていません
となりますが、 どのように定義設定すればよいのでしょうか
(TOTO) 2015/04/28(火) 16:03

 βさんのコードだけじゃ動きません
 >JoinTextFiles は変更有りません。そのまま使います。
 のとおりに、kanabunさんのPrivate Sub JoinTextFiles(fArray, fTarget)から下を全部、βさんのコードの続きにコピペしてください

 >kanabunさん、βさん
 わたしのPCでは、Join.txtがダイアログのファイル名に入らず手入力しました
 とりあえず以下でしのぎましたが、せっかくファイル名入ってるのになぜなんでしょう??
 joinFile = Application.GetSaveAsFilename("Join.txt", fileFilter:="Text Files (*.txt), *.txt")
(もあ) 2015/04/28(火) 17:48

 >わたしのPCでは、Join.txtがダイアログのファイル名に入らず手入力しました
 >とりあえず以下でしのぎましたが、せっかくファイル名入ってるのになぜなんでしょう??

 こちらでも同じ状況でした。フィルター規定していないからかな?と、同じように"Text Files (*.txt), *.txt"を指定しても同じでした。

 以前(2003時代)は確か表示されたような記憶があります。
 バージョンアップで何かかわったんでしょうかねぇ??

 追伸です。

 フィルター文字を "Text,*.txt" だけにすると ファイル名(join.txt)が表示されました。
 なぜなのかはわかりませんが。

(β) 2015/04/28(火) 18:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.