Tự động trích xuất tệp văn bản qua dòng lệnh và kết hợp chúng thành một tệp văn bản


1

Giải thích chuyên sâu về vấn đề:

Tôi đang cố gắng tự động hóa một quy trình trên máy tính của mình và gặp một số khó khăn. Mỗi ngày, tôi gửi email một tệp zip chứa tệp txt. Tôi có một đoạn script tự động lấy tệp đính kèm và đưa nó vào một thư mục cục bộ.

Bây giờ, tôi đang cố gắng tìm hiểu làm thế nào tôi có thể lấy nội dung của tệp txt từ thư mục và nối nó vào "tệp chính". Về cơ bản, làm thế nào nó hoạt động bây giờ là tôi có một kho lưu trữ được gửi qua email cho tôi mỗi ngày của [TODAY'S_DATE] .zip. Một tập lệnh di chuyển lưu trữ vào một thư mục. Sau đó, tôi có một tệp .bat trích xuất nội dung vào một thư mục có tên [TODAY'S_DATE] và di chuyển kho lưu trữ vào một thư mục có tiêu đề "Đã hoàn thành". Tôi cần biết cách lấy văn bản ra khỏi tệp vì nó được trích xuất và kết xuất nó thành tệp "Master.txt" sẽ liên tục lớn hơn.

Điều này sẽ tránh sự cần thiết phải trích xuất các tệp vào thư mục riêng của họ và sao chép thủ công văn bản từ chúng và vào tệp chính.

Thiết lập của tôi:

  • Sử dụng Windows 7
  • Sử dụng dòng lệnh 7zip để giải nén
  • Sử dụng tệp .Bat để trích xuất tệp từ tệp lưu trữ vào thư mục

Vấn đề:

  • Cần lấy txt từ kho lưu trữ và hợp nhất nó vào tệp "master.txt".

Nội dung hiện tại của tệp .bat:

7za x *.zip -o*

COPY /Y *.zip " \Completed\"

@echo extraction complete

Tôi thực sự đánh giá cao bất kỳ sự giúp đỡ có thể được cung cấp. Tôi biết điều này thực sự dài dòng, nhưng thường khi tôi thấy những loại câu hỏi này, không đủ chi tiết được trình bày. Cám ơn bạn một lần nữa.


type file >> masterfilehoặc một cái gì đó tương tự nên làm việc. Bạn đã thử những gì? Xem thêm tại đây .
Daniel Beck

Cảm ơn vì mối lên kết đó. Tôi đã cố gắng để sao chép file1.txt + file2.txt, nhưng bạn phải biết thư mục và tên tệp để tôi bị kẹt tại thời điểm đó. Tôi thực sự chưa quen với kịch bản lệnh, nhưng nó ngày càng trở nên cần thiết hơn cho những gì tôi đang cố gắng thực hiện. Cảm ơn một lần nữa, tôi sẽ làm việc với một vài trong số này và xem những gì tôi có thể tìm ra! :-)
Kris

Câu trả lời:


1

Bạn có thể nối nội dung của một tệp vào một tệp khác bằng lệnh "type" và toán tử ">>" như vậy:

type todaysfile.txt >> masterfile.txt

Trước tiên, bạn có thể phải chèn một dòng mới vào masterfile của mình, vì vậy nội dung mới bắt đầu ở dòng mới của chính nó, như vậy:

echo. >> masterfile

Nếu bạn không biết tên tệp, bạn có thể nối thêm mọi tệp trong thư mục "đã hoàn thành" như vậy:

type completed\* >> masterfile.txt

"type" và "echo" sẽ xuất ra mọi thứ và toán tử ">>" yêu cầu nó nối thêm đầu ra đó vào một tệp.

Nguồn: loại , tiếng vang , chuyển hướng lệnh


vấn đề của anh ấy là (chỉ có thể được tìm ra từ bình luận của anh ấy, mặc dù ...) "Tôi đã cố gắng để sao chép file1.txt + file2.txt để làm việc, nhưng bạn phải biết thư mục và tên tệp"

vâng, không thấy bình luận đó trong khi viết, đã cập nhật câu trả lời của tôi cho phù hợp với nhu cầu mới
XyZZy

1

Thật đơn giản:
copy file1.txt+fileX.txt intome.txthoặccopy singlefile.txt+intome.txt

EDIT: chỉ cần đọc bình luận của bạn cho bài viết của bạn. Vì vậy, bạn không biết tên tập tin? Hãy để tôi mở rộng những thứ ở trên ... chỉ một giây thôi :)

EDIT2: Tôi đã phải tìm kiếm nó và tôi nghĩ cách dễ nhất bạn có thể làm là không biết tên tệp là: copy /b *.txt newfile.txtnhư một dòng lệnh A hoặc cmd để ghép nhiều tệp


1

Tôi không chắc rằng tôi hiểu nhận xét của bạn về việc không biết tên tệp của bạn. Tôi đoán tình huống của bạn là bạn có một cấu trúc thư mục giống như thế này:

| ︙
|
+ --- hiện tại
| 730643_594352.txt
|
+ --- chủ
| master.txt

trong đó bạn không biết tên ( 730643_594352.txt) của currenttập tin, nhưng đó là tệp duy nhất (hoặc ít nhất là .txttệp duy nhất ) trong currentthư mục, vì vậy nó *.txthoạt động. Nếu đó là, tại sao không

ren current\*.txt current\today.txt

và sau đó hoạt động trên nó theo tên ( today.txt)? Nếu bạn cần giữ nguyên tên của nó như đã nhận trong zip được gửi qua email, hãy tạo một tempthư mục song song và làm

copy current\*.txt temp\today.txt

0

Bạn có một tệp mới có tên [TODAY'S_DATE] .zip được chuyển vào một thư mục theo một quy trình.

Tôi cho rằng:

  1. Các tập tin thực sự được đặt tên một cái gì đó như : 2013-0511.zip, và nó là khác nhau mỗi ngày.
  2. Thư mục hiện tại tại thời điểm .battệp được chạy là cùng thư mục với nơi .ziptệp mới được tạo.
  3. Chỉ có một .ziptệp để xử lý tại bất kỳ thời điểm nào.
  4. Thư mục mà .txttập tin được trích xuất vào, được tạo bởi quá trình giải nén. Nói cách khác, thư mục đích được đặt tên bên trong .ziptệp, do đó bạn không có gì đặc biệt để tạo thư mục đích trong các lệnh trong tệp bó.
  5. Phần tên của .ziptên tệp (vì vậy '2013-0511' trong ví dụ của tôi ở trên) giống như tên của thư mục bên trong .ziptệp và giống như tên của thư mục mà .txttệp được trích xuất.
  6. Đường dẫn và tên tệp đầy đủ của tệp "Master.txt" là không đổi.

Đây là một tệp bó nên làm việc cho bạn:

@echo off

rem    define the full path and filename of the "Master.txt" file
set "zzmaster=C:\Master\Master.txt"

for %%f in ("*.zip") do call :work "%%~dpf" "%%~nf"

rem        other processing here..., then goto :EOF
rem        recommend moving or deleting the .zip file so it is not present 
rem        the next time this is run, or use MOVE instead of COPY below


rem        cleanup environemnt variables if necessary
set "zzmaster="
set "zzpath="
set "zzname="
set "zztxt="


goto :EOF



:work
rem:work %1, %2 will contain the Path and Name of the .zip file (extension is of course .zip)

set "zzpath=%~1"
set "zzname=%~2"

rem        this will extract the .zip file as you specified before
7za x "%zzname%.zip" -o*
COPY /Y "%zzname%.zip" "\Completed\"
@echo extraction complete

rem        you know the folder that the .txt file was extracted into is the sane as %zzname%
rem        this will look in the new folder created by the unzip process and get all files with an extension of .txt
rem        this can easily be adjusted if it is not what you want.

for %%g in ("%zzname%\*.txt") do call :doappend "%%~nxg"


rem        optional: delete the folder that contained the extracted .txt file(s)
rem rd "%zzname%">nul 2>&1

goto :EOF



:doappend
rem:doappend %1 is the name.ext of the file to append to master

set "zztxt=%~1"

rem        optional: if Master file already exists, add a blank line to the end of Master file
if exist "%zzmaster%" echo.>> "%zzmaster%"


rem        append the contents of the extracted .txt file to the end of the Master file
type "%zzname%\%zztxt%" >> "%zzmaster%"


rem        optional: delete the extracted .txt file
rem del "%zzname%\%zztxt%">nul 2>&1


goto :EOF

Kiểm tra mã "tùy chọn" để xem nó có hợp lý với bạn không.

Nếu "giả định" của tôi không đúng hoặc nếu bạn cần một cái gì đó thay đổi, hãy cho tôi biết.


0

Tôi muốn cảm ơn tất cả những người đã dành thời gian để trả lời. Tôi đã đào sâu hơn trong tài liệu của 7Zip và thử nghiệm một số thứ và cuối cùng đi đến câu trả lời.

Tôi chắc chắn rằng nhiều câu trả lời trên trang này có thể được sử dụng theo nhiều cách khác nhau để đạt được kết quả tương tự, nhưng tôi muốn tránh càng nhiều tệp tin càng tốt.

Điều cần thiết là một chuyển đổi từ 7zip (-so). Điều này cho phép bạn trích xuất tệp thành STDOUT và bạn có thể chuyển hướng luồng đến bất kỳ tệp nào bạn muốn.

Đây là những gì nó trông giống như:

7za e *.zip -y -so >> masterlist.txt

Điều này cho phép tôi bỏ qua việc trích xuất tệp vào một thư mục hoàn toàn giúp tiết kiệm không gian đĩa và xử lý tệp. Nếu bạn có cấu trúc vào thư mục và bạn biết tên tệp (Tôi không có sự sang trọng đó), thì bạn có thể sử dụng:

7za e *.zip -ir!PATH\FILENAME.txt -y -so >> masterlist.txt

Ngoài ra, trong trường hợp bất cứ ai muốn xem tệp .bat đang hoạt động, đây là những gì tôi có.

7za e *.zip -y -so >> masterlist.txt
MOVE /Y *.zip  Completed
@echo extraction complete

Dòng 1: 7zip trích xuất tệp đơn và gửi đầu ra tới STDOUT và sau đó được thêm vào (>>) vào masterlist.txt.

Dòng 2: Lưu trữ zip được chuyển đến thư mục Đã hoàn thành để nó sẽ không được xử lý lại trong tương lai.

Dòng 3: Nó cho bạn biết quá trình trích xuất hoàn tất, mặc dù bạn có thể sẽ không thấy điều này (ít nhất là với cách tôi đang sử dụng nó).

Tôi hy vọng điều này sẽ giúp ai đó. :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.