อ่านและเขียนลงในไฟล์โดยใช้ VBScript

เราจะอ่านและเขียนสตริงลงในไฟล์ข้อความโดยใช้ VBScript ได้อย่างไร ฉันหมายความว่าฉันมีไฟล์ข้อความที่มีอยู่แล้ว ดังนั้นเมื่อฉันใช้โค้ดด้านล่างนี้:-

Set fso = CreateObject("Scripting.FileSystemObject" )            
Set file = fso.OpenTextFile("C:\New\maddy.txt",1,1) 

สิ่งนี้จะเปิดไฟล์เพื่อการอ่านเท่านั้น แต่ฉันไม่สามารถเขียนอะไรได้เลยและเมื่อฉันใช้รหัสนี้: -

Set fso = CreateObject("Scripting.FileSystemObject" )            
Set file = fso.OpenTextFile("C:\New\maddy.txt",2,1)

ฉันสามารถใช้ไฟล์นี้เพื่อเขียน แต่ไม่สามารถอ่านอะไรเลย มีอยู่หรือไม่ที่เราสามารถเปิดไฟล์สำหรับอ่านและเขียนได้โดยเพียงแค่เรียกเมธอด OpenTextFile เพียงครั้งเดียว

ฉันยังใหม่กับ VBScript มาก ฉันคุ้นเคยกับแนวคิด C เท่านั้น มีลิงค์ใด ๆ ที่ทำให้ฉันเริ่มต้นใช้งาน VBScript ได้จริง ๆ หรือไม่?

ฉันเดาว่าฉันต้องมีความรู้ที่ดีเกี่ยวกับแนวคิดเกี่ยวกับวัตถุและคุณสมบัติ


person Community    schedule 17.07.2009    source แหล่งที่มา


คำตอบ (9)


คุณสามารถสร้างไฟล์ชั่วคราว จากนั้นเปลี่ยนชื่อกลับเป็นไฟล์ต้นฉบับได้:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
strTemp = "c:\test\temp.txt"
Set objFile = objFS.GetFile(strFile)
Set objOutFile = objFS.CreateTextFile(strTemp,True)
Set ts = objFile.OpenAsTextStream(1,-2)
Do Until ts.AtEndOfStream
    strLine = ts.ReadLine
    ' do something with strLine 
    objOutFile.Write(strLine)
Loop
objOutFile.Close
ts.Close
objFS.DeleteFile(strFile)
objFS.MoveFile strTemp,strFile 

การใช้งานเกือบจะเหมือนกันเมื่อใช้ OpenTextFile:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
strTemp = "c:\test\temp.txt"
Set objFile = objFS.OpenTextFile(strFile)
Set objOutFile = objFS.CreateTextFile(strTemp,True)    
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    ' do something with strLine 
    objOutFile.Write(strLine & "kndfffffff")
Loop
objOutFile.Close
objFile.Close
objFS.DeleteFile(strFile)
objFS.MoveFile strTemp,strFile 
person ghostdog74    schedule 17.07.2009
comment
ประเด็นเดียวคือคุณควรใช้ objOutFile.WriteLine(Inp) เพื่อส่งออกบรรทัดเดียวกัน - person ib11; 30.04.2019

ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับวัตถุ FileSystemObject ได้ที่ http://msdn.microsoft.com/en-us/library/aa242706(v=vs.60).aspx. สำหรับ VBScript ที่ดี ฉันขอแนะนำ:

  • ตัวเลือกที่ชัดเจน เพื่อช่วยตรวจจับการพิมพ์ผิดในตัวแปร
  • ฟังก์ชัน และ ย่อย เพื่อปรับปรุงการอ่านและนำกลับมาใช้ใหม่
  • Const เพื่อให้ค่าคงที่ที่รู้จักกันดีได้รับชื่อ

ต่อไปนี้เป็นโค้ดสำหรับอ่านและเขียนข้อความลงในไฟล์ข้อความ:

Option Explicit

Const fsoForReading = 1
Const fsoForWriting = 2

Function LoadStringFromFile(filename)
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForReading)
    LoadStringFromFile = f.ReadAll
    f.Close
End Function

Sub SaveStringToFile(filename, text)
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForWriting)
    f.Write text
    f.Close
End Sub

SaveStringToFile "f.txt", "Hello World" & vbCrLf
MsgBox LoadStringFromFile("f.txt")
person Stephen Quan    schedule 16.01.2012
comment
ฟังก์ชันทั้งสองจำเป็นต้องใช้เมธอด f.Close เพื่อไม่ให้ไฟล์เปิดอยู่ - person Rich; 28.02.2014
comment
.ReadAll ดูเหมือนว่าจะมีขีดจำกัดขนาดไฟล์ซึ่งวิธีอื่นไม่มี หรืออย่างน้อยสคริปต์ของฉันก็ขัดข้องกับไฟล์ที่มีขนาดเกิน 1GB หรือมากกว่านั้น ... - person JOATMON; 11.11.2016
comment
อย่าใช้ ReadAll สำหรับไฟล์ขนาดใหญ่ แต่ใช้วัตถุ TextStream เพื่อบัฟเฟอร์การอ่าน / เขียนแทน - person user692942; 21.04.2020

คุณสามารถเปิดสตรีมข้อความได้สองรายการ รายการหนึ่งสำหรับการอ่าน

Set filestreamIn = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt,1)

และอีกอันสำหรับการต่อท้าย

Set filestreamOUT = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt,8,true)

filestreamIN สามารถอ่านได้จากจุดเริ่มต้นของไฟล์ และ filestreamOUT สามารถเขียนที่ส่วนท้ายของไฟล์ได้

person Tester101    schedule 17.07.2009

อย่าคิดอย่างนั้น...คุณสามารถใช้ openTextFile สำหรับการอ่าน (1) การเขียน (2) หรือต่อท้าย (8) เท่านั้น อ้างอิงที่นี่

หากคุณ ใช้ VB6 แทน ของ VBScript คุณสามารถทำได้:

Open "Filename" [For Mode] [AccessRestriction] [LockType] As #FileNumber

การใช้โหมด Random ตัวอย่างเช่น:

Open "C:\New\maddy.txt" For Random As #1
person Daniel F. Thornton    schedule 17.07.2009
comment
ฉันยังใหม่กับ vbscripting ฉันแค่คุ้นเคยกับแนวคิด C ของฉัน ใครช่วยกรุณาแนะนำลิงค์ใด ๆ ให้ฉันเพื่อเริ่มต้น vbscripting ของฉันจริงๆ ฉันเดาว่าฉันต้องมีความรู้ที่ดีเกี่ยวกับแนวคิดเกี่ยวกับวัตถุและคุณสมบัติ.. มีข้อเสนอแนะบ้างไหม? - person ; 17.07.2009
comment
นี่คือบทช่วยสอนที่ดีจาก W3Schools: w3schools.com/Vbscript/vbscript_intro.asp - person Daniel F. Thornton; 17.07.2009
comment
นักเปียโน ขอบคุณมาก..ฉันได้ดูลิงก์แล้วและเพิ่งบอกเกี่ยวกับการทำงานขั้นพื้นฐาน ฉันต้องการเจาะลึกลงไปอีกหน่อย เช่น การใช้วัตถุ คลาสต่างๆ ฉันยังใหม่กับคำศัพท์เหล่านี้มาก - person ; 17.07.2009
comment
คำอธิบายโดยละเอียดของข้อกำหนดเหล่านี้: 4guysfromrolla.com/webtech/092399-1 shtml - person Daniel F. Thornton; 17.07.2009

คุณสามารถใส่มันลงในแผ่นงาน Excel ได้ไม่รู้ว่ามันจะคุ้มค่าสำหรับคุณหรือเปล่าถ้ามันจำเป็นสำหรับสิ่งอื่น ๆ แต่การจัดเก็บข้อมูลในแผ่นงาน Excel นั้นดีกว่ามากเพราะคุณสามารถอ่านและเขียนในเวลาเดียวกันได้อย่างง่ายดายด้วย

 'this gives you an excel app
 oExcel = CreateObject("Excel.Application")

 'this opens a work book of your choice, just set "Target" to a filepath
 oBook = oExcel.Workbooks.Open(Target)

 'how to read
 set readVar = oExcel.Cell(1,1).value
 'how to write
 oExcel.Cell(1,2).value = writeVar

 'Saves & Closes Book then ends excel
 oBook.Save
 oBook.Close
 oExcel.Quit

ขออภัยหากคำตอบนี้ไม่มีประโยชน์ เป็นครั้งแรกที่เขียนคำตอบและคิดว่านี่อาจเป็นวิธีที่ดีกว่าสำหรับคุณ

person Spy    schedule 04.09.2015

คุณยังสามารถอ่านไฟล์ทั้งหมดและจัดเก็บไว้ในอาร์เรย์ได้

Set filestreamIN = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt",1)
file = Split(filestreamIN.ReadAll(), vbCrLf)
filestreamIN.Close()
Set filestreamIN = Nothing

จัดการอาร์เรย์ด้วยวิธีที่คุณเลือก จากนั้นเขียนอาร์เรย์กลับไปยังไฟล์

Set filestreamOUT = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt",2,true)

for i = LBound(file) to UBound(file)
    filestreamOUT.WriteLine(file(i))
Next

filestreamOUT.Close()
Set filestreamOUT = Nothing 
person Tester101    schedule 17.07.2009
comment
นั่นเป็นวิธีหนึ่ง โดยที่ไฟล์ไม่ใหญ่มาก - person ghostdog74; 18.07.2009
comment
เกือบจะเป็นซับเดียวนั่นคือคุณสามารถไป file = Split(CreateObject(...).OpenTextFile(...,1).ReadAll(), vbCrLf) :) - person Stephen Quan; 17.01.2012

ไม่ว่าคุณกำลังพยายามทำอะไรอยู่ ก็ไม่จำเป็นต้องอ่านและเขียนไฟล์ไปพร้อมๆ กัน นอกจากนี้ยังจะใช้หน่วยความจำมากขึ้นซึ่งควรหลีกเลี่ยงเสมอ ฉันขอแนะนำให้อ่านไฟล์ทั้งหมดโดยใช้เมธอด .ReadAll จากนั้นปิดและทำทุกอย่างที่คุณต้องทำกับข้อมูล (สมมติว่าคุณอ่านเนื้อหาลงในตัวแปร) จากนั้นเขียนลงในไฟล์เดียวกันและเขียนทับไฟล์ . หากคุณกังวลว่าจะมีบางอย่างผิดพลาดเมื่อเขียนทับไฟล์ปัจจุบัน คุณสามารถลองเขียนลงในไฟล์อื่นและโยนข้อผิดพลาดหากไม่ได้ผลก่อนที่จะพยายามเขียนทับต้นฉบับ

person Christopher J. Scharer    schedule 12.12.2014

ด้านล่างนี้เป็นโค้ดง่ายๆ ในการดำเนินการนี้:

sLocation = "D:\Excel-Fso.xls"
sTxtLocation = "D:\Excel-Fso.txt"
Set ObjExl = CreateObject("Excel.Application")
Set ObjWrkBk = ObjExl.Workbooks.Open(sLocation)
Set ObjWrkSht = ObjWrkBk.workSheets("Sheet1")
ObjExl.Visible = True
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FSOFile = FSO.CreateTextFile (sTxtLocation)
sRowCnt = ObjWrkSht.usedRange.Rows.Count
sColCnt = ObjWrkSht.usedRange.Columns.Count
For iLoop = 1 to sRowCnt
  For jLoop = 1 to sColCnt 
    FSOFile.Write(ObjExl.Cells(iLoop,jLoop).value) & vbtab 
  Next
Next

Set ObjWrkBk = Nothing
Set ObjWrkSht = Nothing
Set ObjExl = Nothing
Set FSO = Nothing
Set FSOFile = Nothing
person Pulkit Agarwal    schedule 30.06.2016
comment
ยินดีต้อนรับสู่ Stack Overflow! โปรดใช้ความระมัดระวังในการลิงก์ไปยังเนื้อหาของคุณเองในเว็บไซต์ต่างๆ คุณไม่ต้องการเป็นสแปมเมอร์ คุณควรรวมเนื้อหาส่วนใหญ่ไว้ที่นี่ และใช้ลิงก์เป็นข้อมูลอ้างอิงเท่านั้น - person NathanOliver; 30.06.2016

นี่เป็นการสร้างไฟล์ข้อความ

For i = 1 to 10
    createFile( i )
Next

Public Sub createFile(a)

    Dim fso,MyFile
    filePath = "C:\file_name" & a & ".txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile = fso.CreateTextFile(filePath)
    MyFile.WriteLine("This is a separate file")
    MyFile.close

End Sub

และนี่สำหรับอ่านไฟล์ข้อความ

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Set dict = CreateObject("Scripting.Dictionary")
Set file = fso.OpenTextFile ("test.txt", 1)
row = 0
Do Until file.AtEndOfStream
  line = file.Readline
  dict.Add row, line
  row = row + 1
Loop

file.Close

For Each line in dict.Items
  WScript.Echo line
  WScript.Sleep 1000
Next
person YourHelper    schedule 13.08.2016