Board logo

标题: [文本处理] [已解决]批处理more命令打不开大文件? [打印本页]

作者: hucuibai    时间: 2011-3-31 15:19     标题: [已解决]批处理more命令打不开大文件?

本帖最后由 hucuibai 于 2011-4-12 10:15 编辑

我用more打开一个40多M的txt文档重定向到另外一个txt,输出的是空白,内容读不出来,这是为什么,more有限制功能还是怎么样??


文件我传不上来,太大了,每行的内容都是一致的,大致就是这样的
56128485220, 248053, 3, "2011-03-28 23:58:46", "2011-03-29 00:00:14", "119.1.17.209", 0, 0(有N行,这是程序产生的日志文件)
我就是想把这个文件的内容读出来,然后输入到另外一个文件里面,格式就是在每行内容上面加上(内容),文件是unicode编码的,我是目的就是要把这个文件的内容读出来,然后放到.sql文件里面去!


把源文件内容删了,留开头几行!上传上来
作者: hucuibai    时间: 2011-3-31 15:35

哦 知道了 more是分屏显示的,能不能够一次性显示完呢?
作者: tmplinshi    时间: 2011-3-31 15:36

本帖最后由 tmplinshi 于 2011-3-31 15:48 编辑

最多输出 65534 行。(测试系统:XP SP2)

改用 type 命令,或 copy New.txt+40MB.txt New.txt /b
作者: hucuibai    时间: 2011-3-31 15:46

type 打不开我那个ansi文件,只能用more
作者: hucuibai    时间: 2011-3-31 15:46

3# tmplinshi


type 打不开我那个ansi文件,只能用more
作者: CrLf    时间: 2011-3-31 15:50

我是win7系统,显示65391行就暂停了,末行显示-- More (20%) -- ...
不过测试文件并未超过40M,只有38.6M,莫非与此有关?
作者: hucuibai    时间: 2011-3-31 15:54

F:\123\gamerecord-chn1030\20110329>more /?
逐屏显示输出。

MORE [/E [/C] [/P] [/S] [/Tn] [+n]] < [drive:][path]filename
command-name | MORE [/E [/C] [/P] [/S] [/Tn] [+n]]
MORE /E [/C] [/P] [/S] [/Tn] [+n] [files]

    [drive:][path]filename  指定要逐屏显示的文件。

    command-name                 指定要显示其输出的命令 。

    /E      启用扩展功能
    /C      显示页面前先清除屏幕
    /P      扩展 FormFeed 字符
    /S      将多个空白行缩成一行
    /Tn     将跳格键扩展成 n 个空格(默认值为 8)

            命令行开关可以出现在 MORE 环境变量中。

    +n      从第 n 行开始显示第一个文件

    files    要显示的文件列表。 用空格分开列表中的文件。

    如果扩展的功能已经启用,在 -- More -- 提示处会接受下列
    命令:

    P n     显示下 n 行
    S n     略过下 n 行
    F       显示下个文件
    Q       退出
    =       显示行号
    ?       显示帮助行
    <space> 显示下一页
    <ret>   显示下一行


我看不懂这个格式,如果要用<space>这个扩展命令要怎么写?
作者: hucuibai    时间: 2011-3-31 15:59

6# zm900612


刚刚看了more的参数,能开启扩展命令,但是我不知道格式该怎么写,有谁看的懂的?
作者: tmplinshi    时间: 2011-3-31 15:59

本帖最后由 tmplinshi 于 2011-3-31 16:03 编辑

7# hucuibai


命令扩展默认是启用的。“<space> 显示下一页”的意思是按空格显示下一页。例如你试试运行:
  1. dir %windir%\*.exe | more
复制代码

作者: hucuibai    时间: 2011-3-31 16:06

9# tmplinshi


这样哦,那真没办法了?还有没有其他的命令,能够替代啊?type不行,打不开ansi编码的文件
作者: CrLf    时间: 2011-3-31 16:08

type打不开ansi编码文件???
作者: hucuibai    时间: 2011-3-31 16:20

本帖最后由 hucuibai 于 2011-3-31 16:50 编辑

11# zm900612
  1. @echo off
  2.     for /r F:\123 %%i in (*.txt) do (
  3. >456.txt (
  4.         for /f %%a in ('type %%i') do echo ^(%%a^)^,
  5. )
  6. )
  7. pause
复制代码
貌似这样不行
作者: hucuibai    时间: 2011-3-31 16:25

本帖最后由 hucuibai 于 2011-3-31 16:27 编辑

"2011-3-29 0:0:35",1,56129910365,56148967108,5008,71,3,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
"2011-3-29 0:0:35",1,56129910365,43205880120,112008,76,3,0,5,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
"2011-3-29 0:0:35",1,56129910365,56148710277,25008,73,3,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
"2011-3-29 0:0:35",1,56129910365,56149345836,102023,72,4,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
"2011-3-29 0:0:35",1,56129910365,77733315566,132008,74,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
"2011-3-29 0:0:35",1,56129910365,56151401567,80001,60,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
"2011-3-29 0:0:35",1,56129910365,77762226858,820108,75,2,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0

文件内容都是这种格式的,内容有四十多M 我想输出以后得到 ("2011-3-29 0:0:35",1,56129910365,77762226858,820108,75,2,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0),这种格式的的另外一个文件,文件是ansi编码的!
作者: CrLf    时间: 2011-3-31 16:48

12楼是代码错了吧,【>456.txt(】这里似乎少一个空格
作者: hucuibai    时间: 2011-3-31 16:50

14# zm900612


哦 这是失误,源文件有的!
作者: CrLf    时间: 2011-3-31 16:53

  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do echo (%%a^))>456.txt
复制代码

作者: city_85    时间: 2011-3-31 16:55

zm900612 大哥强悍!!!!!!!!
作者: hucuibai    时间: 2011-3-31 16:59

本帖最后由 hucuibai 于 2011-3-31 17:02 编辑

16# zm900612


你这个不行,你试试把你的文件另存为ansi编码的 然后再运行你写的,读不出内容,文件是空的!!
作者: CrLf    时间: 2011-3-31 17:07

这样猜谜很困难,能否贴出你的目录树、测试代码、结果呢?
作者: hucuibai    时间: 2011-3-31 17:18

19# zm900612



文件我传不上来,太大了,每行的内容都是一致的,大致就是这样的
56128485220, 248053, 3, "2011-03-28 23:58:46", "2011-03-29 00:00:14", "119.1.17.209", 0, 0(有N行,这是程序产生的日志文件)
我就是想把这个文件的内容读出来,然后输入到另外一个文件里面,格式就是在每行内容上面加上(内容),我最快四十的代码是
for /f %%i in ('more 1.txt') do echo ^(%%i^),>456.txt
后面看more不能显示出全部内容就改用type
for /f %%i in ('type1.txt') do echo ^(%%i^),>456.txt
还是不行,刚刚用了你写的这个代码,另外新建一个记事本把原来的内容复制进去,用你的代码是可以的,但是源文件就不行了,应该是编码问题吧
作者: CrLf    时间: 2011-3-31 17:26

不可能是编码问题,bat本来就是为ansi而生的...看来for也有极限啊...
有一个思路,没试验过:
  1. copy 1.txt 2.txt
  2. fsutil file setzerodata offset=0 length=20000000 1.txt
  3. fsutil file setzerodata offset=20000000 length=30000000 2.txt
复制代码
然后分别处理1.txt和2.txt,不过只有在ntfs格式的盘上才可以这样,而且也不确定fsutil能不能处理这么大的文件,毕竟这体积有点极端了...
作者: hucuibai    时间: 2011-3-31 17:29

哦 错了 错了 编码是unicode编码的文件
作者: hucuibai    时间: 2011-3-31 17:30

21# zm900612


搞错了,源文件是unicode编码的
作者: CrLf    时间: 2011-3-31 17:38

20楼似乎在和1.txt之间漏了个空格
试试:
  1. @echo off
  2. (for /f "delims=" %%a in ('type 1.txt') do echo (%%a^))>456.txt
复制代码

作者: hucuibai    时间: 2011-3-31 17:43

24# zm900612


不行,最后剩个括号!
作者: hucuibai    时间: 2011-3-31 18:38

人呢,都下班吃饭去啦
作者: wc726842270    时间: 2011-3-31 23:37

23# hucuibai
首先说明一下TYPE是能打开UNICODE文件的,但是有个条件,就是在有“FFFE”编码头的情况下,如果没有即使是UNICODE也会按照ANSI来打开文件(PS:0X00不做转换)也就是说TYPE是可以正确打开UNICODE的,另外SORT也是可以的,而MORE则将0X00理解成别的字符了
作者: hucuibai    时间: 2011-3-31 23:45

27# wc726842270


那要怎么弄呢?
作者: wc726842270    时间: 2011-3-31 23:48

没有文件的话可能仅是空谈,最好还是上传一下吧,这样解决的也会更快,更好
作者: hucuibai    时间: 2011-4-1 00:01

29# wc726842270


文件有四十M好像传不上来吧
作者: hucuibai    时间: 2011-4-1 00:03

29# wc726842270

哦 现在传也传不了,文件在公司,明天看能传上来不,请你帮忙看看,呵呵,要睡觉了~晚安
作者: Batcher    时间: 2011-4-1 01:02

22# hucuibai


请在顶楼说清楚这一点
作者: Batcher    时间: 2011-4-1 01:05

13# hucuibai


请把问题描述更新到顶楼
作者: Batcher    时间: 2011-4-1 01:05

试试这个:
  1. sed -i "s/^/(/;s/$/)/" a.txt
复制代码

作者: hucuibai    时间: 2011-4-1 10:28

34# Batcher


这个是修改源文件,我现在是要把内容读出来重定向到另外一个.sql文件,导入数据库,所以改源文件不行
作者: CrLf    时间: 2011-4-1 12:33

我倒,不能改原文件,难道还不能复制吗?
作者: hucuibai    时间: 2011-4-1 13:10

36# zm900612


要是说我另存复制能解决问题,我就不用搞批处理了,直接手工做就好了,日志文件那么多,我每个都去复制,那搞着批处理有什么用!做这个批处理就是想让它自动工作
作者: CrLf    时间: 2011-4-1 13:23

本帖最后由 zm900612 于 2011-4-1 13:25 编辑

我是说不需要在原文件上操作,复制一个临时的出来,或者从原文件获取输入,再重定向到别的文件
作者: hucuibai    时间: 2011-4-1 13:38

38# zm900612
  1. sed -e "s/^/(/;s/$/),/" PlayerPropertyLog20110329.txt>456.sql
复制代码
我用这个试了一下,能读出来,但是输出的内容,最前面的引号变成了乱码
作者: hucuibai    时间: 2011-4-1 13:40

38# zm900612


源文件发上来,把内容删了,就留了几行
作者: Batcher    时间: 2011-4-1 14:06

35# hucuibai


还有其他背景描述不?能一次性在顶楼说清楚不?
作者: hucuibai    时间: 2011-4-1 14:17

41# Batcher


我重新发个帖
作者: hucuibai    时间: 2011-4-1 14:25     标题: 批处理将txt日志文件导入mysql数据库操作

附件里面是txt文件的一部分内容,源文件有四十多M,因为太大所有传不了那么多,我的需求就是把,这些数据读出来重定向到另外一个.sql文件里面,按照mysql插入数据的格式
use db_name
insert into table(a,b,c) values
(txt第一行内容),
(txt第二行内容),
    .
    .
    .
    .
(txt最后一行内容);

这样应该够清楚了吧!呵呵!大家帮忙看看!有什么好办法!
作者: hucuibai    时间: 2011-4-1 15:03

本帖最后由 hucuibai 于 2011-4-1 15:05 编辑
  1. @echo off
  2.             >456.sql (
  3.                 echo use !str2!^;
  4.                 echo insert into playerpropertylog^(列名^) values
  5.                 for /f "delims=" %%a in ('more %%i') do echo ^(%%a^)^,
  6.                      )
复制代码
用这段代码可以解决小文件,但是文件大了,more命令输出不了,用type sort 都不行
作者: tmplinshi    时间: 2011-4-1 16:40

本帖最后由 tmplinshi 于 2011-4-1 16:43 编辑

我打开你的附件,然后不停复制粘贴,把文件扩充到了 76 MB,然后进行了以下测试:
  1. type 76M.txt >76M_type.txt
  2. sort 76M.txt >76M_sort.txt
  3. :: 两个输出文件的行数与原文件都相同
复制代码
  1. @echo off
  2. (for /f "delims=" %%a in ('type 76M.txt') do echo ^(%%a^),)>new.txt
  3. :: 这个没有耐心等完,按 Ctrl+C 终止后,new.txt 有 400 多 KB。
复制代码

作者: hucuibai    时间: 2011-4-1 17:00

3# tmplinshi


你这个不行,你是下的我的源文件?不是复制的里面的内容新建的记事本吧?我的源文件是unicode编码,用你的这个不能输出!
作者: tmplinshi    时间: 2011-4-1 18:22

4# hucuibai


打开你的文件,复制里面的内容再粘贴到里面。
作者: hucuibai    时间: 2011-4-1 21:54

5# tmplinshi


手工复制?日志文件有很多,而且都很大,还是你的意思是说你下载的时候是直接打开的然后复制里面的内容到新的txt文档 然后用你写的那个语句操作??
作者: tmplinshi    时间: 2011-4-1 22:02

6# hucuibai


下载保存你的附件,打开,全选,复制,再粘贴到文件末尾,再全选,复制,粘贴到文件末尾,再全选...
作者: hucuibai    时间: 2011-4-2 10:14

49# tmplinshi


亲爱的斑竹同志,我按照你的步骤从新做了一遍,结果还是不行,输出为0字节,cmd窗口没反应,就剩个光标在那闪,等了十来分钟还是0字节

下载附件,打开,全选,复制,再粘贴到文件末尾,再全选,复制,粘贴到文件末尾,再全选...
文件四十多M之后  我复制你的代码运行!会不会是我的系统跟你的系统不一样,我的是xp sp3
作者: tmplinshi    时间: 2011-4-2 10:29

50# hucuibai

运行以下代码,看文件行数是否一样:
  1. @echo off
  2. set file="40m.txt"
  3. type %file% >40m_type.txt
  4. echo 正在统计 %file% 行数...
  5. find /v /c "" %file%
  6. echo ================
  7. echo 正在统计 40m_type.txt 行数...
  8. find /v /c "" 40m_type.txt
  9. echo ================
  10. pause
复制代码

作者: hucuibai    时间: 2011-4-2 10:47

49# tmplinshi


我刚刚把你的那两个综合了一下,必须要产生一个零时文件过度一下,不然就在for循环里面使用type源文件不能输出,但是那些小文件就可以,for循环也有限制的?
  1. @echo off
  2. type PlayerPropertyLog20110329.txt>1.txt
  3. (for /f "delims=" %%i in (1.txt) do echo ^(%%i^)^,)>2.sql&&del /s /q 1.txt>nul
复制代码

作者: CrLf    时间: 2011-4-12 13:17

当for从文件读取输入时是一行一行进行,而从命令获取输入时是等该命令运行完毕后再进行,不知道for中的命令输出是存在内存里还是临时文件,我感觉应该是内存吧...
作者: hucuibai    时间: 2011-4-12 13:27

53# zm900612


小文件是可以读出来的,可能是文件太大了,是不是因为for命令获取type输出的时间太久了
作者: CrLf    时间: 2011-4-12 13:43

type、more、for等命令都是一行一行获取输入、处理、再输出的,所以单独使用的时候应该不会预先把文件内容读取到内存吧,不过for+命令是特例,必须先等待命令运行完毕,才能用for进行处理,所以我猜for从命令所获取的输入因该是暂存在内存里吧,cmd所能使用的内存是有上限的,所以会出现各种诡异现象。个人感觉,没有验证




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2