Autohotkey 中文论坛

完整版: 求教:如何删除文本文档的1-10行内容
你目前正在浏览的是简化版. 请点击这里浏览完整版
求教:如何删除文本文档的1-10行内容(删除后的第一行不能形成空行)
说明里面与file有关的好像只有写入,删除整个文件是有的,上来求教一下看看呢。请帮忙!
读取数据,处理数据(删除部分内容),“重写”整个文件。
对文件的编辑好像只能追加,要么重写。
我一个文本文档有几百万条数据,我是一次读入10条,输入到excel运算后再复制出来,然后继续后10条,一直到全部处理完。
现在前面的实现了,问题是后续:
如果不能能删除已处理完的,因行号不同,岂不是要几百万条以上的命令?
循环读取命令可以10条读取后运算、操作完成之后再继续循环么?
如果不行,能否有其他好办法呢?
可以记录行号(一样可用循环),继续向后(而非重新开始)执行。
可以两层for..for...,或者把内层的封装成函数(可以反复调用)。
呵呵,有点超出我能力范围了,我只会一些简单的,我把代码发上来你帮我看看吧。
FileReadLine, y01, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 1 ; 读取第1行数据,赋值给y01
FileReadLine, y02, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 2 ;
FileReadLine, y03, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 3 ;
FileReadLine, y04, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 4 ;
FileReadLine, y05, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 5 ;
FileReadLine, y06, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 6 ;
FileReadLine, y07, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 7 ;
FileReadLine, y08, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 8 ;
FileReadLine, y09, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 9 ;
FileReadLine, y10, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, 10 ;
Clipboard := y01 . "`n" . y02 . "`n" . y03 . "`n" . y04 . "`n" . y05 . "`n" . y06 . "`n" . y07 . "`n" . y08 . "`n" . y09 . "`n" . y10 ;分行合并到剪贴板
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
WinWait, ssqhmfxb2.xlsx - Excel ;等一下
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
Send ^m ; 粘贴数据
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
WinWait, ssqhmfxb2.xlsx - Excel ;等一下
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
clipboard = ; 让剪贴板初始为空, 这样可以使用 ClipWait 检测文本什么时候被复制到剪贴板中.
Send ^j ; 复制数据
ClipWait ; 等待剪贴板中出现文本.
FileAppend , %clipboard% , C:\Users\vaio2\Desktop\ssq\双色球全部号码\x0001.txt ;数据插入到x0001文档
clipboard = ; 让剪贴板初始为空
return ; 程序结束,返回。

以上内容只完成了1-10行,麻烦专家帮我看看。
我对excel比较熟悉,ahk的实例及帮助不是太完善,想进阶不易啊。
你好,我来小试身手,请大家指正!

#a::
nmytemp=1
loop 10
{
FileReadLine, y%nmytemp%, C:\Users\vaio2\Desktop\ssq\双色球全部号码\ssq 01.txt, %nmytemp%
nmytemp++
}
gosub gogo
return

sub gogo()
Clipboard := y01 . "`n" . y02 . "`n" . y03 . "`n" . y04 . "`n" . y05 . "`n" . y06 . "`n" . y07 . "`n" . y08 . "`n" . y09 . "`n" . y10 ;分行合并到剪贴板
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
WinWait, ssqhmfxb2.xlsx - Excel ;等一下
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
Send ^m ; 粘贴数据
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
WinWait, ssqhmfxb2.xlsx - Excel ;等一下
WinActivate, ssqhmfxb2.xlsx - Excel ;激活excel窗口
clipboard = ; 让剪贴板初始为空, 这样可以使用 ClipWait 检测文本什么时候被复制到剪贴板中.
Send ^j ; 复制数据
ClipWait ; 等待剪贴板中出现文本.
FileAppend , %clipboard% , C:\Users\vaio2\Desktop\ssq\双色球全部号码\x0001.txt ;数据插入到x0001文档
clipboard = ; 让剪贴板初始为空
return


用手机弄真累,且对程序也不熟悉,需要找资料核实。
提供思路,第二次运行程序的时候,只要把nmytemp变量乘2就可以了。
子程序调用可能不要括号?!
祝好运。
呵呵,高手来了,手机弄成这样不易啊。

我是先设置10个变量,分别存入1-10的数值,作为文档行数;
然后是循环程序,每个循环将这10个变量加10,用起来正常了,只是程序行数大多了。

学到子程序的运用了,此前没有这个概念。非常感谢。
代码:
/*
假设你要处理的文件是一个,并且名为“待处理.txt”
*/

OnExit, 退出时记录已处理行数                ;退出时记录已处理行数到配置文件中。注意应避免在循环中记录,这样可以有最佳的性能表现
IniRead, 已处理行数, 记录.ini, 记录, 已处理行数, 0                ;读取已处理行数

FileRead, file, 待处理.txt
Loop, Parse, file, `n, `r
{
    if (A_Index<=已处理行数)
        continue
    MsgBox, 这里填入要实际处理的代码,因为代码执行到这里后,肯定是没有处理过的行了
    Line:=A_Index                ;记录已处理行数,以便程序退出时写入配置文件中
}
return

退出时记录已处理行数:
    IniWrite, Line, 记录.ini, 记录, 已处理行数
    ExitApp
return

原理就是,有个配置文件,记录已处理的行。下次运行程序时,会跳过已处理的行,再处理。
感谢 相见时难 的回复,用loop程序简单多了。849112292d 程序我再研究,一并感谢。目前的程序已运行正常,如下:

MsgBox, 262148, , 重要提示:`n 1. 打开双色球号码分析表2.xlsm,试验宏是否可用 `n 2. 对应的数据为C:\Users\vaio2\Desktop\双色球\双色球全部号码\双色球全部号码数据.txt `n 3. 输出的文本文档为C:\Users\vaio2\Desktop\双色球\双色球全部号码\x0001.txt `n `n 如以上工作均已完成可继续运行本程序 `n `n 有任何问题可点“否”退出,要继续吗?
BlockInput, On ; 阻断键盘和鼠标的输入
FileAppend , %A_Now% `n , C:\Users\vaio2\Desktop\双色球\双色球全部号码\x0001.txt ;将当前时间插入到x0001文档
x1x =2 ;文本的行号变量,初始为1
loop 10000 ;合计读入的行为10000*50=50万行
{
y1y =1 ;存数据的变量号,初始为1
loop 50 ;每次读50行
{
FileReadLine, y%y1y%, C:\Users\vaio2\Desktop\双色球\双色球全部号码\双色球全部号码数据.txt, %x1x%
y1y :=y1y+1
x1x :=x1x+1
}
Clipboard := y1 . "`n" . y2 . "`n" . y3 . "`n" . y4 . "`n" . y5 . "`n" . y6 . "`n" . y7 . "`n" . y8 . "`n" . y9 . "`n" . y10 . "`n" . y11 . "`n" . y12 . "`n" . y13 . "`n" . y14 . "`n" . y15 . "`n" . y16 . "`n" . y17 . "`n" . y18 . "`n" . y19 . "`n" . y20 . "`n" . y21 . "`n" . y22 . "`n" . y23 . "`n" . y24 . "`n" . y25 . "`n" . y26 . "`n" . y27 . "`n" . y28 . "`n" . y29 . "`n" . y30 . "`n" . y31 . "`n" . y32 . "`n" . y33 . "`n" . y34 . "`n" . y35 . "`n" . y36 . "`n" . y37 . "`n" . y38 . "`n" . y39 . "`n" . y40 . "`n" . y41 . "`n" . y42 . "`n" . y43 . "`n" . y44 . "`n" . y45 . "`n" . y46 . "`n" . y47 . "`n" . y48 . "`n" . y49 . "`n" . y50 ;分行合并到剪贴板
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
WinWait, 双色球号码分析表2.xlsm - Excel ;等一下
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
Send ^m ; 启动宏粘贴数据
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
WinWait, 双色球号码分析表2.xlsm - Excel ;等一下
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
clipboard = ; 让剪贴板初始为空, 这样可以使用 ClipWait 检测文本什么时候被复制到剪贴板中.
Send ^j ; 启动宏复制数据
ClipWait ; 等待剪贴板中出现文本.
FileAppend , %clipboard% , C:\Users\vaio2\Desktop\双色球\双色球全部号码\x0001.txt ;数据插入到x0001文档
y1y= ;清空数据的变量号,只能从1-50。
}
clipboard = ; 清空剪贴板
FileAppend , %A_Now% , C:\Users\vaio2\Desktop\双色球\双色球全部号码\x0001.txt ;将当前时间插入到x0001文档
BlockInput, Off ; 激活键盘鼠标输入
return
核心问题: 亲,有什么运算需要excel来处理?

直接用ahk获取行里面的字段,然后用ahk处理一下不就可以了么,这样可以避免使用窗口,剪贴板,而且稳定性,速度神马的肯定要快多了
公式多且复杂,编程不易。excel速度确实是瓶颈。
高手 云集
我想如果在 文本文档的 某行追加文本 不知道要怎么写,我只知道一个 尾部追加的fileappend
可以将“Clipboard := y1 . "`n" . y2 . …… . "`n" . y50”简化一下。
s=
Loop 50
s.= "`n" . y%A_Index%
Clipboard := SubStr(s,2)
代码:
FileRead, 全文内容, C:\Users\vaio2\Desktop\双色球\双色球全部号码\双色球全部号码数据.txt
行内容:=[]    ;-- 用一个数组一次性保存所有行的数据,避免多次读取文件
Loop, Parse, 全文内容, `n, `r
  行内容[A_Index]:=A_LoopField
总行数:=行内容.MaxIndex()
全文内容=    ;-- 清空变量占用的内存

BlockInput, On ; 阻断键盘和鼠标的输入
目标文件=C:\Users\vaio2\Desktop\双色球\双色球全部号码\x0001.txt
FileAppend , %A_Now% `n , %目标文件%  ;将当前时间插入到x0001文档

初始行=1 ;文本的行号变量,初始为1
Loop {
  s=
  Loop, 50               ;-- 读取50行数据
    if (初始行<=总行数)
      s.= "`n" . 行内容[初始行++]

  if s=    ;-- 读取不到数据了就可以退出了
    Break

Clipboard := SubStr(s,2)
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
WinWait, 双色球号码分析表2.xlsm - Excel ;等一下
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
Send ^m ; 启动宏粘贴数据
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
WinWait, 双色球号码分析表2.xlsm - Excel ;等一下
WinActivate, 双色球号码分析表2.xlsm - Excel ;激活excel窗口
clipboard = ; 让剪贴板初始为空, 这样可以使用 ClipWait 检测文本什么时候被复制到剪贴板中.
Send ^j ; 启动宏复制数据
ClipWait ; 等待剪贴板中出现文本.
FileAppend , %clipboard% , %目标文件%  ;数据插入到x0001文档
}

行内容=  ;-- 清空数组
clipboard = ; 清空剪贴板
FileAppend , %A_Now% , %目标文件%  ;将当前时间插入到x0001文档
BlockInput, Off ; 激活键盘鼠标输入
Return
参考网址