แบทช์ไฟล์เพื่อสร้างไฟล์จำนวนมากที่มีตัวอักษรพิเศษ


0

ข้อมูลสำคัญ:ฉันมีไฟล์ "DB_OUTPUT.TXT" ที่มี 304 บรรทัดที่ฉันต้องเปลี่ยนเป็น 304 ไฟล์ (หนึ่งรายการต่อบรรทัด) แต่ละบรรทัดมีอักขระพิเศษจำนวนมากและอาจยาวได้ถึงหมื่นตัวอักษร ด้วยเหตุผลเหล่านี้ฉันมีปัญหาในการใช้ไฟล์แบตช์ cmd.exe (ซึ่ง จำกัด จำนวนอินพุต) และคำสั่ง echo (ซึ่งจะพยายามเรียกใช้อักขระพิเศษแต่ละตัว

ฉันยังมีไฟล์ "DB_OUTPUT_FILENAMES.TXT" ที่มีชื่อไฟล์ที่แตกต่างกันสำหรับแต่ละบรรทัดที่ใกล้จะเป็นไฟล์จาก "db_output.txt" ดังนั้นบรรทัดที่ 1 ของ DB_OUTPUT.TXT จะต้องเป็นเนื้อความของไฟล์ใหม่ที่มีชื่อเท่ากับบรรทัดที่ 1 ของ DB_OUTPUT_FILENAMES.TXT

ข้อมูลเพิ่มเติม:ตามที่คุณคาดเดาได้ DB_OUTPUT.TXT จะถูกส่งออกจากฐานข้อมูล มันมี 304 ระเบียนที่มี 6 หรือ 7 คอลัมน์ที่ความกว้างคงที่กับคอลัมน์สุดท้ายเป็นแบบสอบถาม SQL แต่ละบรรทัดเหล่านี้ (บันทึก db) จะถูกใช้เป็นสคริปต์เพื่อสร้างวัตถุฐานข้อมูลใหม่ซึ่งเป็นสาเหตุที่ต้องเก็บรักษาอักขระพิเศษไว้

คำถาม:มีวิธีการทำเช่นนี้ในรูปแบบของชุดงานหรือไม่? ฉันมีความสุขกับโซลูชัน Windows หรือ Linux อย่างใดอย่างหนึ่ง


คำถาม: คุณใช้ภาษาอย่าง Python, PHP และอื่น ๆ หรือไม่? หรือคุณมีความต้องการที่จะต้องทำอย่างหมดจดใน Bash หรือชุด CMD? ทั้งสองวิธี miiiight นี้เป็นคำถามที่จัดการได้ดีที่สุดโดย StackOverflow
dotVezz

ไม่ขัดต่อภาษา เพิ่งเกิดความคุ้นเคยกับสภาพแวดล้อมแบบเชลล์ ขอบคุณสำหรับทิศทาง
MollyOQ

คำตอบ:


0

splitควรใช้งานได้ (เพิ่งทดสอบกับไฟล์ไบนารีซึ่งยิ่งแย่กว่าที่คุณอธิบาย):

split -l 1 DB_OUTPUT.txt

สิ่งนี้จะสร้างไฟล์จำนวนมากที่ขึ้นต้นด้วย "x" ในการเปลี่ยนชื่อชุดพวกเขาเริ่มต้นด้วย

ls x* > oldnames

ตรวจสอบอีกครั้งว่าจำนวนของบรรทัดเห็นด้วย:

wc -l oldnames DB_OUTPUT_FILENAMES.TXT

ซึ่งควรให้สองบรรทัดในจำนวนเท่ากันหากรายการชื่อไฟล์ของคุณมีความยาวที่เหมาะสม สุดท้าย

( paste oldnames DB_OUTPUT_FILENAMES.TXT ) | while read i; do mv $i; done

(โปรดทราบว่านี่ถือว่าชื่อไฟล์ที่ส่งออกไม่มีช่องว่าง)


0

นี่คือเชลล์สคริปต์:

#!/bin/sh

test "$#" -ne 3 && { echo arguments: datafile namefile dstdir ; exit 1 ; }

data="$1"
names="$2"
dstdir="$3"

test -e "$dstdir" || mkdir "$dstdir"

while read fn ; do
    read -r lin <&3
    echo -n "$lin" >"$dstdir/$fn"
done <"$names" 3<"$data"

คุณสามารถเรียกใช้สคริปต์ในสภาพแวดล้อมแบบ Unix เช่น Linux, Mac OS X หรือ Cygwin ภายใต้ Windows splittofilesเก็บสคริปต์สำหรับตัวอย่างลงในไฟล์ chmod a+x splittofilesทำ

splittofiles DB_OUTPUT.TXT DB_OUTPUT_FILENAMES.TXT outputรัน: outputไฟล์ที่ส่งผลให้จะถูกสร้างขึ้นในไดเรกทอรี

สคริปต์ควรขัดด้วยการเพิ่มเงื่อนไขการตรวจสอบข้อผิดพลาดเพิ่มเติม โปรแกรมใน Python ที่กล่าวถึงในบันทึกย่ออาจเร็วกว่าสคริปต์นี้


readโดยค่าเริ่มต้นถือว่า\ เป็นพิเศษ -rต้องเพิ่มสวิตช์เพื่อreadไม่ให้ทำเช่นนั้น
pabouk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.