[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コマンドラインで複数のテキストファイルを改行しながら結合』(のらじろう)
エクセルとは直接関係ないのですが、↓のスレッドに関しての質問です。
[[20150427163551]] 『複数のテキストファイルを1つにする』(TOTO)
たとえば、下記のような4つのテキストファイルを結合する場合です。
------------- 1.txt 1111 1111 ------------ 2.txt 222 22 ------------- 3.txt 3333 33333 ------------- 4.txt 44444444444444 4444444444444444 -------------
コマンドラインやバッチファイルで結合したら↓のようになると思います。
Mookさんご呈示のコマンドです。
Copy %1 + %2 + %3 + %4 All.txt
------------------ All.txt 1111 1111222 223333 3333344444444444444 4444444444444444 ----------------
これを↓のようにファイルとファイルの間に改行を挟みながら結合したい場合 はどのようにすればいいでしょうか?
---------------- All.txt 1111 1111 222 22 3333 33333 44444444444444 4444444444444444 ---------------
VBAなどでテキストファイルの内容を読み込み、改行を挟みながら結合する、 という方法はわかっています。 これをコマンドラインで出来たら便利だな、と考えています。 方法がありましたらご教示お願いいたします。
< 使用 Excel:Excel2007、使用 OS:WindowsVista >
検索で↓の記述がありました。
>つまり、結合したからと言って、改行を自動的に付与してくれるわけでは無いため、 >結合される側のファイルの最後部には、改行を意識していれる必要がある。
解決方法は書かれてないのでコマンドでは用意されてない、ということなのでしょうか。 (のらじろう) 2015/05/01(金) 08:47
完全にかぶりましたが、メモしましたので。
まったく素人ですぺっている公算大ですが。
元ネタのテキストファイルの最後の行も改行した上で作成しておくことが必要なのでは? 自動的に改行を挿入してくれそうもないようですから。
逆に、改行で終わっていなければ連続して1行にしたいなんて人も、中にはいるかも(まず、いないでしょうけど)
(β) 2015/05/01(金) 09:02
βさん、ご回答ありがとうございます。
やはり自分で改行のみのファイルを間に挟む、などと するしか方法がないようです。
http://aver-ats.com/wordPress/cmdprompt/copy/
ありがとうございました。 (のらじろう) 2015/05/01(金) 09:20
echoコマンドを使う方法もある。 (改行のみのファイルを用意する必要がなくなるが手順は増える。バッチファイルなどでは有効かもしれない)
copy 1.txt all.txt echo.>> all.txt copy all.txt + 2.txt echo.>> all.txt copy all.txt + 3.txt echo.>> all.txt copy all.txt + 4.txt
バッチファイルにする場合は copy %1 all.txt echo.>> all.txt copy all.txt + %2 echo.>> all.txt copy all.txt + %3 echo.>> all.txt copy all.txt + %4
(ねむねむ) 2015/05/01(金) 10:02
ねむねむさんの案を使って、バッチにするならこんなんでも。 引数の数(結合するファイル)はいくつでも構いません。
@echo off del all.txt 2> NUL for %%f in ( %* ) do type %%f >> all.txt && echo.>>all.txt
(Mook) 2015/05/01(金) 10:30
ねむねむさん、ご回答ありがとうございます。
↓は改行して結合来ました。
>copy 1.txt all.txt >echo.>> all.txt >copy all.txt + 2.txt >echo.>> all.txt >copy all.txt + 3.txt >echo.>> all.txt >copy all.txt + 4.txt
下記のコードでVBAからコマンドラインを起動して実行しました。 Sub test() Dim fol As String Dim txtmei As String Dim dt As String Dim cmd As String Dim cnt As Integer Dim alltxtmei As String alltxtmei = "all.txt" cnt = 0 fol = "G:\hoge"
cmd = "cd/d " & """" & fol & """"
txtmei = Dir(fol & "\*.txt")
Do While txtmei <> ""
cnt = cnt + 1
If cnt = 1 Then
cmd = cmd & " & copy " & """" & txtmei & """" & " " & alltxtmei
Else
cmd = cmd & " & echo.>> " & alltxtmei & " & copy " & alltxtmei & " + " & """" & txtmei & """"
End If
txtmei = Dir()
Loop
Call Shell(Environ$("ComSpec") & " /c" & cmd)
End Sub
下記のバッチファイルはall.txtは生成されるのですが、内容は4行の改行のみでした。 (テキストファイルが4つ(1.txt 2.txt 3.txt 4.txt)で試しました)
>copy %1 all.txt >echo.>> all.txt >copy all.txt + %2 >echo.>> all.txt >copy all.txt + %3 >echo.>> all.txt >copy all.txt + %4
Mookさん、ご回答ありがとうございます。
>@echo off >del all.txt 2> NUL >for %%f in ( %* ) do type %%f >> all.txt && echo.>>all.txt
バッチ化してフォルダの中において実行したのですが、all.txtは生成されませんでした。 (のらじろう) 2015/05/02(土) 00:18
後半の二つは引数を処理するバッチなので、バッチだけ実行してもなにも処理されませんよ。
結合.bat a.txt b.txt c.txt d.txt e.txt f.txt のように実行したでしょうか。 (あるいはバッチに処理するファイル(a.txt〜f.txt)をドロップする)
結合.bat ?.txt のように1文字のファイルを処理するなどという指定もできます。 *.txt は all.txt が含まれてしまうので、他のフォルダを指定するか、拡張子を変えて おかないとうまくいかないです。
(Mook) 2015/05/02(土) 09:30
Mookさん、再度のご教示ありがとうございます。
>後半の二つは引数を処理するバッチなので、バッチだけ実行してもなにも処理されませんよ。 >あるいはバッチに処理するファイル(a.txt〜f.txt)をドロップする
二つともテキストファイルのドラッグアンドドロップで作動しました。ありがとうございました。
コマンドラインをVBAから起動する方は下記のように生成したall.txtをデスクトップに移動するようにしてみました。
コマンドラインの処理終了を待つのは下記のURLの記述を参考にさせていただきました。
http://www.moug.net/tech/acvba/0010013.html
Option Explicit
Private Declare Function OpenProcess _
Lib "kernel32" _
(ByVal dwDesiredAccess As Long _
, ByVal bInheritHandle As Long _
, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle _
Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess _
Lib "kernel32" _
(ByVal hProcess As Long _
, lpExitCode As Long) As Long
Private Const STATUS_PENDING As Long = &H103
Private Const STILL_ACTIVE As Long = STATUS_PENDING
Private Const PROCESS_QUERY_INFORMATION As Long = &H400
Sub test()
Dim FSO As Object
Dim myId As Long
Dim myProcess As Long
Dim myExitCode As Long
Dim fol As String
Dim txtmei As String
Dim cmd As String
Dim cnt As Integer
Dim alltxtmei As String
Dim alltxtpath As String
Dim newtxtpath As String
Set FSO = CreateObject("Scripting.FileSystemObject")
cnt = 0
fol = "G:\hoge"
alltxtmei = "all.txt"
alltxtpath = fol & "\" & alltxtmei
If FSO.fileexists(alltxtpath) Then
AppActivate Application.Caption
MsgBox alltxtpath & vbCrLf & "は既に存在するファイル名です。"
Set FSO = Nothing
Exit Sub
End If
newtxtpath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & alltxtmei
cmd = "cd/d " & """" & fol & """"
txtmei = Dir(fol & "\*.txt")
Do While txtmei <> ""
cnt = cnt + 1
If cnt = 1 Then
cmd = cmd & " & copy " & """" & txtmei & """" & " " & """" & alltxtmei & """"
Else
cmd = cmd & " & echo.>> " & """" & alltxtmei & """" & " & copy " & """" & alltxtmei & """" & " + " & """" & txtmei & """"
End If
txtmei = Dir()
Loop
myId = Shell(Environ$("ComSpec") & " /c" & cmd)
'プロセスオブジェクトハンドルの取得
myProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, myId)
'終了コードの監視
Do
GetExitCodeProcess myProcess, myExitCode
DoEvents
Loop While myExitCode = STILL_ACTIVE
'オブジェクトハンドルの解放
CloseHandle myProcess
'メッセージを表示
'MsgBox "終了。", vbInformation
If FSO.fileexists(newtxtpath) Then
AppActivate Application.Caption
MsgBox newtxtpath & vbCrLf & "は既に存在するファイル名です。"
Else
FSO.MoveFile alltxtpath, newtxtpath
End If
Set FSO = Nothing
End Sub
(のらじろう) 2015/05/02(土) 23:04
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.