[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数のテキストファイルを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
ウッシさんの質問は、単純に二つのファイルの中身をくっつけた場合、 タイトル行が途中に入るからダメなのかどうか。 ということを確認したいコメントなのですが、その点はどうなのでしょうか。
また、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
ちなみに、
4つのテキストファイルを合算した後、
続けてマクロでデータ加工予定です。
(TOTO) 2015/04/28(火) 15:37
βさんのコードだけじゃ動きません >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.