openoffice: ค้นหาและแทนที่

ต้องการค้นหาและแทนที่ เอกสาร OpenOffice-Writer ที่บันทึกไว้เป็นนามสกุล .doc
(เพื่อให้ใช้งานข้ามระบบได้ เลยบันทึกเป็น .doc ตระกูล Microsoft-Word)
โดยต้องการทำงานเป็นแบตช์ คือค้นหาและแทนที่คำว่า OLD ด้วยคำว่า NEW กับทุก ๆ ไฟล์

แก้ปัญหาโดยต้องเข้าไปสร้างคำสั่งมาโครภาษาเบสิกไว้ก่อน แล้วจึงสั่งงานด้วยบรรทัดคำสั่งในเชลล์อีกทีนึง

เริ่มด้วย ไปที่เมนู
Tools -> Macros -> Organize Macros -> OpenOffice.org Basic
-> My Macros -> Standard

เลือก New

ตั้งชื่อรูทีนว่า BatchFixMissSpell

...
Sub BatchFixMissSpell(cFile)
  rem Load file
  cURL = ConvertToURL( cFile ) 
  rem Set document
  oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", SELF, Array() )
  rem Create Search Descriptor
  FandR = oDoc.createSearchDescriptor()
  rem Set search/replace string
  FandR.setSearchString("OLD") : FandR.setReplaceString("NEW")
  rem Do replace
  oDoc.ReplaceAll(FandR) 
  rem Save file
  oDoc.storeToURL( cURL, Array() )
  rem Write & exit
  oDoc.dispose()
End Sub
...

บันทึกแล้วออกจากทั้งโปรแกรมมาโคร และ OpenOffice-Writer เลย

สมมุติถ้าจะค้นและแทนที่กับทุกไฟล์ที่เป็นนามสกุล .doc ใช้คำสั่งในเชลล์ว่า
$ for i in *.doc; do soffice -invisible "macro:///Standard.Module1.BatchFixMissSpell(`pwd`/$i)"; done

เวลาใช้งานจริงอาจเก็บเป็นคำศัพท์ที่ผิดบ่อยแล้วเขียนลงไว้หลาย ๆ ศัพท์ น่าจะดี

อ้างอิง

เพิ่มเติม

  • เวลาใช้งานกับชื่อไฟล์ภาษาไทย อาจมีปัญหาตอนส่งผ่านอาร์กิวเมนต์ อาจแปลงชื่อไฟล์เป็นอังกฤษก่อน แล้วจึงแปลงกลับ บรรทัดคำสั่งเป็นดังนี้
    $ for i in *.doc; do \
        echo $i;\
        cp "$i" xxx.doc;\
        soffice "macro:///Standard.Module1.BatchFixMissSpell(`pwd`/xxx.doc)";\
        mv xxx.doc "$i";\
    done
  • ถ้าไฟล์ใหญ่ ดูเหมือนหลังจากทำไปสัก 10 ไฟล์ จะช้าลงจนค้างไปเลย ยังไม่ทราบวิธีแก้ (การยกเลิกตัวเลือก -invisible ช่วยได้เล็กน้อย)