急!急!急!批处理(或vb语句)删除当前文件夹所有文本文档的每一行的前n个字符串

用批处理做。注意是删除字符窜,不是文件哦。(比如“粤B000H6”)
删除当前文件夹所有文本文档的每一行的前n个字符串。
另外,能不能删除每行特定的列的呢(比如“2011/04/18 00:07:53”)?
最好是写批处理,或者就vb代码也行。
文本内容如下:
粤B000H6,2011/04/18 00:07:53,114.118347,22.574850,0,0,0,
粤B000H6,2011/04/18 00:08:01,114.118347,22.574850,0,0,0,
粤B000H6,2011/04/18 00:08:03,114.118347,22.574850,0,2,0,
粤B000H6,2011/04/18 00:08:33,114.118301,22.574301,0,25,4,
粤B000H6,2011/04/18 00:08:39,114.118286,22.573967,0,22,3,
粤B000H6,2011/04/18 00:09:03,114.119698,22.573833,0,28,1,
粤B000H6,2011/04/18 00:09:33,114.121696,22.573650,0,25,3,
粤B000H6,2011/04/18 00:10:03,114.122498,22.571751,0,31,1,
粤B000H6,2011/04/18 00:10:09,114.123032,22.571867,0,35,1,
'先引用excel *.0 object library

Public ex As Excel.Application
Public wb As Excel.Workbook
Public sh As Excel.Worksheet
Private Sub Command3_Click()
Dim i As Long, A As Long
Dim arr() As String, str As String, Count As Long
Dim Result As String
Set ex = CreateObject("Excel.Application")
'Set wb = ex.Workbooks.Add '新建excel
Set wb = ex.Workbooks.Open("c:\file.csv") ' 你的A文件 ?????此处如何实现 变量 控制文件名???????????
Set sh = wb.Sheets(1) '第一个工作表

sh.Columns("C:C").Select '第三列
ex.Selection.Delete Shift:=xlToLeft

wb.Close SaveChanges:=True '直接关闭
ex.Quit
MsgBox "删除完毕"
'ex.Visible = True
Set ex = Nothing
Set wb = Nothing
Set sh = Nothing
End Sub

可以啊,而且如果你的文本都是那个格式,用bat就很容易。
其实你的是两个要求,只给你第二个的答案吧。因为第二个的答案就可以胜任第一个的要求了。
代码中的nn=2是去掉第2列,改成你自己的需要。
(这个只可以去除前3列中的,多了我看也没必要)
重要注意:每次运行都会删除指定的列,所以别运行多了。或者备份源文件。
@echo off
set nn=2
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
set b=%%~fa&set h=%%~nxa&echo 0>tem>nul
for /f "tokens=1,2,3* delims=," %%m in ('type "!b!"') do (
if %nn%==1 (echo %%n,%%o,%%p>>tem)
if %nn%==2 (echo %%m,%%o,%%p>>tem)
if %nn%==3 (echo %%m,%%n,%%p>>tem))
del "!b!"
ren "tem" "!h!")
exit追问

我试了试这个可行。但是有个有个问题,我的数据有13798个文档,每个文档大概1兆,这个批处理的速度太慢了,处理一个文件就要好几分钟啊。所以能不能用别的方法呢。这里有两个vb的代码引用excel的方法我试了试,缺点是不能实现批量处理,它引用文件路径的代码中不能用变量(我想把文件名批量改为递增的数字,然后用循环变量控制处理文件的文件名,使用变量是个问题。)代码我放在问题补充里了,你看看能不能改进啊?

追答

哦,不会vb,(且没装excel)还是看楼下的吧。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-14
下面代码改一下,应该能提高很多的效率。

@echo off
set nn=2
setlocal enabledelayedexpansion
for /r %%a in (*.txt) do (
set b=%%~fa&set h=%%~nxa&echo 0>tem>nul
for /f "usebackq tokens=1,2,3* delims=," %%m in ("!b!") do (
if %nn%==1 (echo %%n,%%o,%%p>>tem)
if %nn%==2 (echo %%m,%%o,%%p>>tem)
if %nn%==3 (echo %%m,%%n,%%p>>tem))
del "!b!"
ren "tem" "!h!")
exit追问

不行啊,这个速度还是不太理想,提速不是很多,主要还是因为我的文件太多,记录太多了,得选用能整列处理的算法,不能逐条记录修改呀!

追答

那就用下面的VBS来做吧,把这个VBS放到CSV文件夹下, 也可以更改getfolder 目录。
不过你这么多数据,怎么不用SQL来做呢?

Set FSO = CreateObject("Scripting.FileSystemObject")

set FF=FSO.getfolder(".") '当前文件夹

set FC=FF.files

dim objXl,objWork,sh

Set objXl=CreateObject("Excel.Application")

objXl.DisplayAlerts=FALSE

objXl.visible=FALSE

for each fl in FC
ext=Lcase(fso.GetExtensionName(fl))

if ext="csv" then

Set objWork=objXl.Workbooks.Open(fl,3,False)

Set sh = objWork.Sheets(1)

sh.Columns(3).Delete '删除第3行

objXl.Workbooks(1).Save

objWork.Close

end if

Next

objxl.quit

Set objXl=Nothing
Set objWork=Nothing
set sh=Nothing
set FC=nothing
set FF=nothing
Set FSO=nothing

追问

哇塞,这个很给力哦!
那继续问你个问题好么?
我能不能判断一下某列的值是否完全一样(比如提问中倒数第三列全是0)?如果此文件的某列中所有值都为一个值(比如0),就将此文本给删除了,或者移动到其他文件夹中呢?

追答

EXCEL宏其实我也不太清楚,上面查了部分excel函数资料。
你懂得VBA的话,方法应该差不多的吧,比如计算得到某列sum值>0就可以了。

我建议你还是用数据库来分析数据吧,哪怕是office的那个什么数据库。
更新,修改的方便。

本回答被提问者采纳
相似回答