急求编一个batch用于批量提取文本中指定行及指定列的内容,并输出到新的文本中?
发布网友
发布时间:2022-04-22 08:36
我来回答
共4个回答
热心网友
时间:2022-04-22 10:05
用vbs也比较好做 。我写了一个,你把代码拷贝下来,保存到txt文档中,再将文档的后缀名改成vbs,双击运行就可以了
我按你那个问题中要求又改了,肯定能满足要求
option explicit
dim iswrite
iswrite=0
call main
function main()
dim posinfo,pos,filestr
filestr=getfilestr()
posinfo=getpos("f:\pos.txt")
for each pos in posinfo
call showinfo(filestr,pos)
next
end function
function getfilestr()
dim fso,fread,str,linestr,userstr
set fso=createobject("scripting.filesystemobject")
dim filestr
filestr=inputbox("请输入文件绝对路径","获取文件路径","f:\a.txt")
set fread=fso.opentextfile(filestr,1)
str=fread.readall
fread.close
if str="" then
wscript.echo "文件为空"
wscript.quit
end if
set fso=nothing
getfilestr=str
end function
function showinfo(sourcestr,userinput)
dim userinfo,linenum,querystr,strarry,linestr
strarry=split(sourcestr,vbcrlf)
linenum=0
userinfo=split(userinput,",")
for each linestr in strarry
if linenum=cint(userinfo(0))-1 then
querystr="第"+userinfo(0)+"行,第"+userinfo(1)+"至"+userinfo(2)+"字符是 "+mid(linestr,cint(userinfo(1)),cint(userinfo(2))-cint(userinfo(1)))+vbcrlf
if iswrite=0 then
writedata("----------------------------------")
end if
call writedata(querystr)
end if
linenum=linenum+1
next
iswrite=1
end function
function writedata(querydata)
Dim fsobj, MyFile
Set fsobj = CreateObject("Scripting.FileSystemObject")
if fsobj.FileExists("f:\data.txt") then
set MyFile=fsobj.opentextfile("f:\data.txt",8)
else
Set MyFile = fsobj.CreateTextFile("f:\data.txt", false)
end if
MyFile.WriteLine(querydata)
MyFile.Close
end function
function getpos(path)
dim fsobj,posfile,posstr,posarry
set fsobj=CreateObject("Scripting.FileSystemObject")
if fsobj.fileexists(path) then
set posfile=fsobj.opentextfile(path,1)
else
set posfile=fsobj.createtextfile(path,false)
end if
posstr=posfile.readall
posarry=split(posstr,vbcrlf)
getpos=posarry
end function
说明:
1、脚本中用的是绝对路径
2、查找到的数据保存在f:\data.txt文档中,如果你想保存在其他文档或位置,直接改脚本就行,如果想通过对话框来做,可以改脚本
3、查询坐标保存在f:\pos.txt文件中,你把坐标写到pos.txt中就行了,坐标形式是例如
第一行 第13到19的字符
应该写成
1,13,19
每个坐标写在一行上
多个坐标就写成
1,13,19
2,13,19
3,13,19
4,13,19
就行了追问太好了,不过我还有最后几点要求:
1. 把输入文件路径的对话框去掉,程序执行中不应有任何对话框中断运行;
2. 输出文件的格式是:
数据1,数据2,数据3,...,数据n
3. 每次执行程序后把输出数据另起一行写入data.txt,也就是不应把先前data.txt中的数据替换掉,这个功能现在就有,直接换行就行,不需要----------------------------------。
追答option explicit
call main
function main()
dim posinfo,pos,filestr
filestr=getfilestr()
posinfo=getpos("f:\pos.txt")
for each pos in posinfo
call showinfo(filestr,pos)
next
call writedata(vbcrlf)
end function
function getfilestr()
dim fso,fread,str,linestr,userstr
set fso=createobject("scripting.filesystemobject")
set fread=fso.opentextfile("f:\a.txt",1)
str=fread.readall
fread.close
if str="" then
wscript.echo "文件为空"
wscript.quit
end if
set fso=nothing
getfilestr=str
end function
function showinfo(sourcestr,userinput)
dim userinfo,linenum,querystr,strarry,linestr
strarry=split(sourcestr,vbcrlf)
linenum=0
userinfo=split(userinput,",")
for each linestr in strarry
if linenum=cint(userinfo(0))-1 then
querystr=mid(linestr,cint(userinfo(1)),cint(userinfo(2))-cint(userinfo(1)))+","
call writedata(querystr)
end if
linenum=linenum+1
next
end function
function writedata(querydata)
Dim fsobj, MyFile
Set fsobj = CreateObject("Scripting.FileSystemObject")
if fsobj.FileExists("f:\data.txt") then
set MyFile=fsobj.opentextfile("f:\data.txt",8)
else
Set MyFile = fsobj.CreateTextFile("f:\data.txt", false)
end if
MyFile.Write(querydata)
MyFile.Close
end function
function getpos(path)
dim fsobj,posfile,posstr,posarry
set fsobj=CreateObject("Scripting.FileSystemObject")
if fsobj.fileexists(path) then
set posfile=fsobj.opentextfile(path,1)
else
set posfile=fsobj.createtextfile(path,false)
end if
posstr=posfile.readall
posarry=split(posstr,vbcrlf)
posfile.close
getpos=posarry
end function
按你的要求改完了,不过输出的数据每行会多一个逗号,懒得改了
热心网友
时间:2022-04-22 11:23
建一个二维数组,文本型 A(0,0)
读入每一行再进行文本分割,当前行加入一维数组,当前行的后面列数为二维数组
这样相当于有了坐标,如:
要取第一行第三列的值,即A [1,3]
再输出
热心网友
时间:2022-04-22 12:58
这种东西最好在linux终端下做 用cut 或者head tail 更高级的sed awk都可以很方便的完成。
windows的cmd不擅长这种东西
热心网友
时间:2022-04-22 14:49
你要用什么语言实现啊?追问用批处理就行