Board logo

标题: [文本处理] 批处理如何输出换行符到文件? [打印本页]

作者: huaxn    时间: 2009-7-1 20:18     标题: 批处理如何输出换行符到文件?

问题:从一个现有的文件a复制数据到另一个文件b,当a文件中的数据中存在换行符的时候,如何将该数据原样的复制到b文件。我现在试过了多种方法都不成功,总是将原本含有换行符得一行数据复制成了两行,就是说换行了。

例如:
原数据是这样的:

"aaa","111111111","我是中国人。你也是","1","533a ","0","   ","0","--"

注意在“我是中国人。”句号后面有个换行符,我写不出来。
拷贝后的数据就成了这样的:

"aaa","111111111","我是中国人。
你也是","1","533a ","0","   ","0","--"

大家应该能看明白,就是换行符被执行了,而不是被保存了。这样一条数据变成了2条,错误是必然的。
之所以不直接复制文本是因为还有别的字符编辑。我这里把源问题说明吧。

原文件有这样的这样数据,很复杂有汉字,有数字也有标点符号,甚至有回车符。
现在的需求是需要把纯粹数字的数据去掉引号,空字符串也去掉引号。其他的保留引号,然后作为导入数据库的数据文件。

"aaa","111111111 ","我是中国人。你也是","1","533a ","0","   ","0","--","","     "," 天涯 "

我的做法是读取每一行内容,判断每个字段是否为纯数字,是否为空字符来去留引号,编辑完毕输入到另一个文件保存为数据文件。
所以必须逐行读取,编辑,输出。现在所有问题都解决,唯独这个回车符我没办法。
若是能直接在原文件修改也行,不过我想不出办法。
文件模型在附件。
在database中经常有这样含有换行符的数据存储,所以该问题也算是个普遍问题。
求解诸位,一定有人遇到过这种问题吧。
作者: Batcher    时间: 2009-7-1 20:40

能否把你的文件以附件的形式传上来看看?
作者: huaxn    时间: 2009-7-2 12:53

好的 我把文件上传上来 各位帮忙看看
再解释一下,我这个复制不是复制文本,而是逐条复制数据到另一个文件。
作者: Batcher    时间: 2009-7-2 13:57     标题: 回复 3楼 的帖子

能否详细介绍一下你是如何“逐条复制数据到另一个文件”的吗?为何不直接复制文件呢?
为了方便更多的人同时帮你解决问题,建议把所有的信息全部更新到顶楼。
作者: huaxn    时间: 2009-7-6 09:53

随风 帮我看看 前面诸多问题都解决 就差这个了
作者: huaxn    时间: 2009-7-8 12:46

没人帮忙解决下么
各位管理员同志
作者: Batcher    时间: 2009-7-8 12:58

可以考虑先把换行符删掉
  1. @echo off
  2. change a.txt /from "&H0D0A" /to "&H0D0D"
  3. change a.txt /from "&H0A" /to null
  4. change a.txt /from "&H0D0D" /to "&H0D0A"
复制代码
第三方命令行工具 change.exe 下载地址:
http://bbs.bathome.net/thread-3981-1-1.html
作者: huaxn    时间: 2009-7-16 22:06

不能用第三方产品
这个东西追求最基本 最简单的做法
作者: Batcher    时间: 2009-7-17 09:56     标题: 回复 8楼 的帖子

不用第三方也行:
  1. @echo off
  2. mshta "javascript:var fso=new ActiveXObject('Scripting.FileSystemObject');fso.OpenTextFile('C:\\1.txt',2,true).Write(fso.OpenTextFile('C:\\a.txt').ReadAll().replace(/\r\n/g, '\n\n'));close()"
  3. mshta "javascript:var fso=new ActiveXObject('Scripting.FileSystemObject');fso.OpenTextFile('C:\\2.txt',2,true).Write(fso.OpenTextFile('C:\\1.txt').ReadAll().replace(/\r/g, ''));close()"
  4. mshta "javascript:var fso=new ActiveXObject('Scripting.FileSystemObject');fso.OpenTextFile('C:\\b.txt',2,true).Write(fso.OpenTextFile('C:\\2.txt').ReadAll().replace(/\n\n/g, '\r\n'));close()"
复制代码

作者: huaxn    时间: 2009-7-17 12:58

谢谢Batcher
能给我说一下/\r\n/g是什么意思么  主要是/xxx/g 这两个“/“是转义符?
作者: huaxn    时间: 2009-7-17 13:16

能给我讲讲这三个步骤分别是干什么的么,我是一个业余学习批处理一个月的新手,多多关照。
作者: Batcher    时间: 2009-7-17 15:07     标题: 回复 10楼 的帖子

\r是回车
\n是换行
/xxx/表示模式匹配
g表示全局

/xxx/g表示对整个文件进行模式匹配
作者: Batcher    时间: 2009-7-17 15:08     标题: 回复 11楼 的帖子

1、把回车换行替换成换行换行
2、把回车删除
3、把换行换行替换成回车换行
作者: huaxn    时间: 2009-7-17 23:41

我明白了 现在我是逐行来读取 并做增删引号的操作 所有不能用这个方法  有没有一种方法能在逐行读取后 替换换行 然后输出换行 并且保证实际效果是 换行符不被执行
作者: Batcher    时间: 2009-7-17 23:50

你的代码能否贴出来看看?
作者: netbenton    时间: 2009-7-18 11:07

“for /f ...”读取文本数据时,不管是单是换行或单是回车或回车换行,都会作为分行处理,所以,纯批是没有办法区分的,只能用其它办法转成其它符号再处理,当处理完成后再转回来。

另外,用纯批生成只含换行符,不带回车符,这里有一个办法:
先用debug生成一个只有换行符一个字符的文件:hh.txt

用以下代码可以生成hh.txt:
  1. (echo e 100 a
  2. echo r cx
  3. echo 1
  4. echo n hh.txt
  5. echo w
  6. echo q) |debug >nul
复制代码
然后用下面的方法,即可以在后面只输出一个换行符,而不是回车换行了:
set/p =[要显示的数据]<nul&type hh.txt



[ 本帖最后由 netbenton 于 2009-7-20 20:11 编辑 ]




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