标题: [文本处理] [已解决]BAT查找没有处理过的文件,进行插入一行,替换引号为换行符,删除指定行 [打印本页]
作者: idctop 时间: 2015-6-10 12:40 标题: [已解决]BAT查找没有处理过的文件,进行插入一行,替换引号为换行符,删除指定行
1、插入首行,指定内容为code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation
2、把‚替换为,
3、把","替换为换行符,就是换一行
4、删除含有[标签:内容]这样内容的整行,包括结束符,就是这一整行都不要了。
我把要处理的文件,及处理好的文件放上来。
作者: idctop 时间: 2015-6-10 12:55
如果已经插入过首行的就表示已经处理过了,就跳过。因为文件夹内会不断的加入这种需要处理的文件。
处理过后别打开看是乱码。
作者: bailong360 时间: 2015-6-10 15:48
本帖最后由 bailong360 于 2015-6-10 16:20 编辑
- @sed -i "/price earnings ratio/n;t;/\",\"/ s//\n/g;/&sbquo\;/ s//,/g;/\[.*:.*\]/d;1i code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation" *.txt
复制代码
http://batch-cn.qiniudn.com/tool/sed.exe
话说郁闷啊,sed在我电脑上运行地好慢,竟然好好几秒,相比之下ssed就快多了
但是ssed的-i参数竟然不起作用....
===============
貌似版本问题,于是将其回滚到4.0.7版,速度快多了
作者: 437153 时间: 2015-6-10 15:59
额,有特殊字符。不会处理,等高手帮忙。
作者: 437153 时间: 2015-6-10 16:17
回复 3# bailong360
sed好强大啊,求教程。
作者: bailong360 时间: 2015-6-10 16:20
回复 5# 437153
sed的教程网上一搜就是一堆呢
作者: terse 时间: 2015-6-11 00:03
这样效率能提高点不- @if(0)==(0) echo off
- set str="code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation"
- dir /b *.txt | cscript -nologo -e:jscript %0 %str%
- pause & exit
- @end
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var s = WScript.Arguments.Item(0);
- var re = new RegExp("^" + s, "i");
- var reg = /.*\[标签:内容\].*/g;
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WScript.StdIn.AtEndOfStream){
- var filename = WScript.StdIn.Readline();
- var text = adoLoadText(filename, 'UTF-8').replace(/\r?\n/ig,'');
- while (!(re.test(text))){
- text = s + "\r\n" + text.replace(/&sbquo/ig,',').replace(/","/ig,'\r\n').replace(reg,'');
- TextToFile(text, filename);
- }
- }
-
- function adoLoadText(filename, charset) {
- var fs, text;
- fs = new ActiveXObject("ADODB.Stream");
- fs.type = 2;
- fs.charset = charset;
- fs.open();
- fs.loadFromFile(filename);
- text = fs.readText(-1);
- fs.close();
- return text;
- }
-
- function TextToFile(text, filename) {
- var fs = new ActiveXObject("Adodb.Stream");
- fs.Charset = 'UTF-8';
- fs.Open();
- fs.WriteText(text);
- fs.SaveToFile(filename, 2);
- fs.Close();
- }
复制代码
作者: idctop 时间: 2015-6-11 08:49
回复 7# terse
非常有效,达到目的了。就是处理后最末尾一行,有个结束符占据了一行,这个是删除含有[标签:内容]这样内容整行出现的,文字内容是删除掉了,但是还留下了个结束符占据了一行。我想要整行的不要,包括结束符。
如果这个结束符不影响自动导入数据库,不处理也没事。但是从技术角度我挺想知道的。
能否在文件处理后导入mysql数据库一次呢?我现在是用Navicat Premium手动导入的。我想每个文件处理后导入一次,同样不重复导入。
本地数据库 主机名:127.0.0.1 端口:3306 用户名:root密码:123456 数据库名:gupiao 表名:sszjlx
表字段和处理后的文件是相同的,就是多了个id 这个id是int类型 自动增长的 主键。
作者: terse 时间: 2015-6-11 10:27
回复 8# idctop
改十五行为- text = s + "\r\n" + text.replace(/&sbquo/ig,',').replace(/","/ig,'\r\n').replace(reg,'').replace(/^\s*$/mg,'');
复制代码
没搞过数据库 不熟悉这块
作者: idctop 时间: 2015-6-11 10:49
回复 9# terse
关于数据库,如果我找到相应的代码,插入到你的代码段中,插入在什么位置?第几行啊?
作者: terse 时间: 2015-6-11 12:27
回复 10# idctop
看什么语言 mysql 你看下数据导入功能
作者: aa77dd@163.com 时间: 2015-6-11 13:02
LOAD DATA INFILE
http://dev.mysql.com/doc/refman/5.6/en/load-data.html
作者: aa77dd@163.com 时间: 2015-6-11 15:27
回复 8# idctop
在 7 楼基础上加入了 mysql 导入代码, 注意 BAT 文件保存为 ANSI 编码, 经测试 "[标签:内容]这样内容整行" 是完全可以正常过滤掉的.
这一部分的字母大小写不要修改- mysql -h127.0.0.1 -P3306 -uroot -p123456 -Dgupiao -e
复制代码
完全代码- @if(0)==(0) echo off
- set str="code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation"
- dir /b *.txt | cscript -nologo -e:jscript %0 %str%
-
- for /f "delims=" %%a in ('dir /b *.txt') do (
- echo %%a
- mysql -h127.0.0.1 -P3306 -uroot -p123456 -Dgupiao -e "LOAD DATA LOCAL INFILE '%%a' INTO TABLE `sszjlx` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (`code`, `name`, `description`, `market`, `suggestion`, `closing_price`, `price`, `exchange rate`, `price earnings ratio`, `the main cost`, `institutional participation`);"
- )
-
- pause & exit
- @end
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var s = WScript.Arguments.Item(0);
- var re = new RegExp("^" + s, "i");
- var reg = /.*\[标签:内容\].*/g;
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WScript.StdIn.AtEndOfStream){
- var filename = WScript.StdIn.Readline();
- var text = adoLoadText(filename, 'UTF-8').replace(/\r?\n/ig,'');
- while (!(re.test(text))){
- text = s + "\r\n" + text.replace(/&sbquo/ig,',').replace(/","/ig,'\r\n').replace(reg,'');
- TextToFile(text, filename);
- }
- }
-
- function adoLoadText(filename, charset) {
- var fs, text;
- fs = new ActiveXObject("ADODB.Stream");
- fs.type = 2;
- fs.charset = charset;
- fs.open();
- fs.loadFromFile(filename);
- text = fs.readText(-1);
- fs.close();
- return text;
- }
-
- function TextToFile(text, filename) {
- var fs = new ActiveXObject("Adodb.Stream");
- fs.Charset = 'UTF-8';
- fs.Open();
- fs.WriteText(text);
- fs.SaveToFile(filename, 2);
- fs.Close();
- }
复制代码
作者: idctop 时间: 2015-6-11 19:05
本帖最后由 idctop 于 2015-6-11 19:37 编辑
回复 13# aa77dd@163.com
不行的。
'mysql' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
我把mysql绝对路径填上去后 提示输入密码。
然后就报错。
ERROR 1049 (42000): Unknown database '123456'
作者: aa77dd@163.com 时间: 2015-6-11 19:26
本帖最后由 aa77dd@163.com 于 2015-6-11 19:33 编辑
回复 14# idctop
你没有安装 mysql 吗? 或者 path 变量里没有加入对应的目录
mysql 下载地址:
http://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-5.6.25.0.msi
那么你就把 mysql 安装并且找到 mysql.exe 所在的目录:
假定你安装了 5.6 版, 并且安装时用的默认路径, 那么会是如下的:
对 32 位 XP, WIN7:- "%ProgramFiles%\MySQL\MySQL Server 5.6\bin\mysql.exe"
复制代码
对 64 位 WIN7:- "%ProgramFiles(x86)%\MySQL\MySQL Server 5.6\bin\mysql.exe"
复制代码
弄清那个全路径是怎样的, 并且用它替换 第 7 行开头的 mysql 注意如果路径中有空格, 那么必须用双引号对括起来
作者: aa77dd@163.com 时间: 2015-6-11 19:43
本帖最后由 aa77dd@163.com 于 2015-6-11 19:46 编辑
回复 14# idctop
可能你改错了, 你把修改的代码贴出来看看- -h127.0.0.1 -P3306 -uroot -p123456 -Dgupiao
复制代码
这里的这些参数中
-p123456 已经指定了密码, 不会要输入密码的, -p后是不跟空格的, 你是不是用了给加了空格了, 成了
-p 123456
作者: idctop 时间: 2015-6-11 19:45
回复 15# aa77dd@163.com
path环境变量我没做,但是我填写了绝对路径的。是连上mysql了,一直提示输入密码。
我控制台进入是正常的。
作者: idctop 时间: 2015-6-11 19:46
- @if(0)==(0) echo off
- set str="code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation"
- dir /b *.txt | cscript -nologo -e:jscript %0 %str%
- for /f "delims=" %%a in ('dir /b *.txt') do (
- echo %%a
- "%ProgramFiles%\MySQL\MySQL Server 5.6\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -p 123456 -D gupiao -e "LOAD DATA LOCAL INFILE '%%a' INTO TABLE `zuoriqgqp` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (`code`, `name`, `description`, `market`, `suggestion`, `closing_price`, `price`, `exchange rate`, `price earnings ratio`, `the main cost`, `institutional participation`);"
- )
- pause & exit
- @end
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var s = WScript.Arguments.Item(0);
- var re = new RegExp("^" + s, "i");
- var reg = /.*\[标签:内容\].*/g;
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WScript.StdIn.AtEndOfStream){
- var filename = WScript.StdIn.Readline();
- var text = adoLoadText(filename, 'UTF-8').replace(/\r?\n/ig,'');
- while (!(re.test(text))){
- text = s + "\r\n" + text.replace(/&sbquo/ig,',').replace(/","/ig,'\r\n').replace(reg,'');
- TextToFile(text, filename);
- }
- }
- function adoLoadText(filename, charset) {
- var fs, text;
- fs = new ActiveXObject("ADODB.Stream");
- fs.type = 2;
- fs.charset = charset;
- fs.open();
- fs.loadFromFile(filename);
- text = fs.readText(-1);
- fs.close();
- return text;
- }
- function TextToFile(text, filename) {
- var fs = new ActiveXObject("Adodb.Stream");
- fs.Charset = 'UTF-8';
- fs.Open();
- fs.WriteText(text);
- fs.SaveToFile(filename, 2);
- fs.Close();
- }
复制代码
作者: aa77dd@163.com 时间: 2015-6-11 19:50
回复 18# idctop
" -h127.0.0.1 -P3306 -uroot -p123456 -Dgupiao -e "
上面的这部分(不包括红色的引号), 严格的按我给你的处理, 不要修改大小写! 不要另加空格!
作者: idctop 时间: 2015-6-11 20:10
回复 19# aa77dd@163.com
非常感谢。我按你要求 明天试试。 呵呵习惯了加空格。
作者: idctop 时间: 2015-6-11 20:31
我表内字段要比文本文件内多一个,会不会有影响?
多了个id自动编号的字段。第一个字段就是id然后才是code字段name字段等等。
作者: aa77dd@163.com 时间: 2015-6-11 20:48
本帖最后由 aa77dd@163.com 于 2015-6-11 20:54 编辑
回复 21# idctop - (`code`, `name`, `description`, `market`, `suggestion`, `closing_price`, `price`, `exchange rate`, `price earnings ratio`, `the main cost`, `institutional participation`)
复制代码
指定了导入的数据是要插入到哪些字段, 每行数据都会按顺序和这些字段对应,
id 没有在上面指定, 是不会有影响的, 它是自动增长的, 也不能由数据给出, 只能由系统自动处理.
如果一个输入行含有过多的字段,则多余的字段被忽略,并且警告的数量增加。
如果一个输入行含有的字段过少,则输入字段缺失的表中的列被设置为默认值。
如果字段值缺失,则对一个空字段值会被按不同方式理解:
· 对于字符串类型,列被设置为空字符串。
· 对于数字类型,列被设置为0。
· 对于日期和时间类型,列被设置为该类型相应的“zero”。
你给出的样本数据中, 有很多行数据是有缺失的, 如果在 mysql 控制台, 你就会看到它们产生的警告信息
If an input line has too many fields, the extra fields are ignored and the number of warnings is incremented.
If an input line has too few fields, the table columns for which input fields are missing are set to their default values. Default value assignment is described in Section 11.6, “Data Type Default Values”.
An empty field value is interpreted different from a missing field:
For string types, the column is set to the empty string.
For numeric types, the column is set to 0.
For date and time types, the column is set to the appropriate “zero” value for the type. See Section 11.3, “Date and Time Types”.
http://dev.mysql.com/doc/refman/5.6/en/load-data.html
作者: idctop 时间: 2015-6-12 09:53
回复 22# aa77dd@163.com
按照你给的方法测试成功了!赞~
但是还存在2个问题:
1、怎么只导入了1000行?实际文件有3875行,有的还要多些。
2、我有多个文件,发现这种方式导入不是新增记录,而只存了1000条记录。所存的还是第一个文件的内容。我对比过了。
就算1个文件只导入了1000行,那么200个文件应当导入200000条记录啊。
作者: idctop 时间: 2015-6-12 10:15
我测试了下。
我提的要求是,每个未经处理的文本文件经过处理后导入数据库,而不重复导入。
那么说明,已经经过处理的文本文件,我再次运行批处理的时候,它是不会被导入到数据库的。
经过测试,我放进未处理的文本文件,执行一次后,现在是导入数据库了,不过就导入了1000行。
然后我清空数据表,再执行,结果这个已经被处理过的文本文件又导入进去了。
应当是已经处理过的,就说明已经导入过了,新的未被处理过的文本文件,处理后导入数据库。
作者: idctop 时间: 2015-6-12 10:23
回复 7# terse
请教下,你写的这段代码是在哪里判断文件已经处理过,不再重复处理的呢?能否把当前要处理或者说正在处理的文件名写入一个变量,然后输出到屏幕。
我想使用这个的一个变量,用在导入数据库。这样导入也避免了重复。
作者: aa77dd@163.com 时间: 2015-6-12 10:49
回复 24# idctop
在 18 楼代码里新增两行- if not exist done md done
- move /y *.txt done\
复制代码
放在第 8 行复制代码
的上面
被处理过的文件会被转移到 done\ 目录中, 不会被再次处理
关于只导入了 1000 行数据, 可能是数据库的配置上对表的大小作了限制
作者: idctop 时间: 2015-6-12 11:54
回复 26# aa77dd@163.com
如果我想在数据库中多增加两个字段,riqi,为当前日期2015-06-12这样格式;shijian,为当前世界11:49
就是我执行导入当前的日期和时间。
但是文本文件中是没有这样的记录的,这个能操作吗?
原文本文件名倒是有,文件名是这样的 股票数据2015-06-12 11-45-20.txt
我想知道两种方式的操作:
1、以当前执行批处理的日期时间来
2、取文件名上的日期时间来
作者: aa77dd@163.com 时间: 2015-6-12 12:13
回复 23# idctop
可以用下面的批处理代码 检查下 表 zuoriqgqp 的配置信息, 看有没有相关的限制- @echo off
- if exist "d:\tab_info" del /f /s /q "d:\tab_info"
-
- "%ProgramFiles%\MySQL\MySQL Server 5.6\bin\mysql.exe" -h127.0.0.1 -P3306 -uroot -p123456 -Dgupiao -e "SELECT 'TABLE_NAME','ENGINE','AVG_ROW_LENGTH','MAX_DATA_LENGTH','CREATE_OPTIONS' UNION ALL select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, MAX_DATA_LENGTH, CREATE_OPTIONS from information_schema.`TABLES` where table_schema = 'gupiao' and table_name = 'zuoriqgqp' INTO OUTFILE 'd:/tab_info';"
-
- type "d:\tab_info"
-
- pause
- exit
复制代码
作者: idctop 时间: 2015-6-12 12:26
回复 28# aa77dd@163.com
检查结果
TABLE_NAME ENGINE AVG_ROW_LENGTH MAX_DATA_LENGTH CREATE_OPTIONS
zuoriqgqp InnoDB 0 0
我上面提的问题帮我看下
作者: aa77dd@163.com 时间: 2015-6-12 14:50
本帖最后由 aa77dd@163.com 于 2015-6-12 18:53 编辑
回复 27# idctop
经测试的完全代码, 注意包括原来的 jscript 代码也在多处作了修改, mysql 改成你自己的全路径即可了- @if(0)==(0) echo off
- set str="code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation"
- dir /b *.txt | cscript -nologo -e:jscript %0 %str%
-
- set "mysql=%ProgramFiles(x86)%\MySQL\MySQL Server 5.6\bin\mysql.exe"
- set "server=127.0.0.1"
- set "port=3306"
- set "username=root"
- set "userpwd=123456"
- set "dbname=gupiao"
- set "tabname=zuoriqgqp"
-
- REM 下行代码为 表 %tabname% 新增两个字段 riqi 和 shijian, 如果字段还没有建立, 就运行一次, 之后就不要再运行了.
- rem "%mysql%" -h%server% -P%port% -u%username% -p%userpwd% -D%dbname% -e "ALTER TABLE `%tabname%` ADD COLUMN (`riqi` DATE, `shijian` TIME);"
-
- for /f "delims=" %%a in ('dir /b *.txt') do (
- echo %%a
- "%mysql%" -h%server% -P%port% -u%username% -p%userpwd% -D%dbname% -e "LOAD DATA LOCAL INFILE '%%a' INTO TABLE `%tabname%` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (`riqi`, `shijian`, `code`, `name`, `description`, `market`, `suggestion`, `closing_price`, `price`, `exchange rate`, `price earnings ratio`, `the main cost`, `institutional participation`);"
- )
-
- if not exist done md done
- move /y *.txt done\
-
- pause & exit
- @end
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var s = WScript.Arguments.Item(0);
- var re = new RegExp("^" + s, "i");
- var reg = /.*\[标签:内容\].*/g;
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var now = new Date();
- var s_date = now.getFullYear() + '-' + (now.getMonth() + 1) + '-' + now.getDate();
- var s_time = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
-
- var time_source = 'file_name'; // 值为 'file_name' : 从数据文件名获取时间; 否则, 获取系统当前时间;
-
- while (!WScript.StdIn.AtEndOfStream){
- var filename = WScript.StdIn.Readline();
- if (time_source == 'file_name') {
- var s_dt = filename.replace(/股票数据|\.txt/gi, '').split(' ');
- s_date = s_dt[0];
- s_time = s_dt[1].replace(/-/g, ':');
- }
- var text = adoLoadText(filename, 'UTF-8').replace(/\r?\n/ig,'');
- while (!(re.test(text))){
- text = s + "\r\n" + s_date + ',' + s_time + ',' + text.replace(/&sbquo/ig,',').replace(/","/ig,'\r\n' + s_date + ',' + s_time + ',').replace(reg,'');
- TextToFile(text, filename);
- }
- }
- function adoLoadText(filename, charset) {
- var fs, text;
- fs = new ActiveXObject("ADODB.Stream");
- fs.type = 2;
- fs.charset = charset;
- fs.open();
- fs.loadFromFile(filename);
- text = fs.readText(-1);
- fs.close();
- return text;
- }
- function TextToFile(text, filename) {
- var fs = new ActiveXObject("Adodb.Stream");
- fs.Charset = 'UTF-8';
- fs.Open();
- fs.WriteText(text);
- fs.SaveToFile(filename, 2);
- fs.Close();
- }
复制代码
作者: terse 时间: 2015-6-13 09:51
本帖最后由 terse 于 2015-6-14 11:42 编辑
回复 25# idctop
重新整理一下代码- @if(0)==(0) echo off
- set str="code,name,description,market,suggestion,closing_price,price,exchange rate,price earnings ratio,the main cost,institutional participation"
- for /f "delims=" %%i in ('dir /b *.txt ^| cscript -nologo -e:jscript %0 %str%') do (
- rem 这里是要处理文件
- echo %%i
- )
- pause & exit
- @end
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var s = WScript.Arguments.Item(0);
- var r = /^.+?(\d{4}(-\d{2}){2})(((\s|-)(\d{2})){2})?.+$/;
- var re = new RegExp("^" + s, "i");
- var reg = /.*\[标签:内容\].*/g;
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WScript.StdIn.AtEndOfStream){
- var filename = WScript.StdIn.Readline();
- var str = filename.replace(
- r,
- function(a,b,c,d) {return(b + d.replace(/-/,':').replace(/\s+/,',') + ',' );
- }
- )
-
- var text = adoLoadText(filename, 'UTF-8').replace(/\r?\n/ig,'');
- while (!(re.test(text))){
- text = s + "\r\n" + text.replace(/&sbquo/ig,',').replace(/","/g,'\r\n' + str).replace(reg,'');
- TextToFile(text, filename);
- WSH.Echo(filename)
- }
- }
-
- function adoLoadText(filename, charset) {
- var fs, text;
- fs = new ActiveXObject("ADODB.Stream");
- fs.type = 2;
- fs.charset = charset;
- fs.open();
- fs.loadFromFile(filename);
- text = fs.readText(-1);
- fs.close();
- return text;
- }
-
- function TextToFile(text, filename) {
- var fs = new ActiveXObject("Adodb.Stream");
- fs.Charset = 'UTF-8';
- fs.Open();
- fs.WriteText(text);
- fs.SaveToFile(filename, 2);
- fs.Close();
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |