Board logo

标题: [文本处理] 批处理如何用多个txt中的内容替换掉csv某列的内容? [打印本页]

作者: nancyaa    时间: 2015-2-12 16:16     标题: 批处理如何用多个txt中的内容替换掉csv某列的内容?

目前CSV的格式:

SKU,    DESCRIPTION
"xxxx",   "0001.txt"
"xxxx",   "0002.txt"
... ...

有若干txt文件,标题分别为:
0001.txt
0002.txt
....

Txt的内容没有规律。

目标是:用0001.txt文件中的内容 替换掉csv中的"0001.txt"这一串字; 0002.txt中的内容 替换掉"0002.txt"依此类推。

实操中txt文件的名字长达32个字符,内容一般更长。

求大神启示!跪谢!!!
作者: pcl_test    时间: 2015-2-12 16:32

本帖最后由 pcl_test 于 2015-2-12 16:34 编辑

回复 1# nancyaa

txt文件里的哪些内容去替换?
txt的文件名是否跟csv里的对应?
作者: nancyaa    时间: 2015-2-12 18:34

回复 2# pcl_test

txt文件名和csv description列的值完全一致。

比如Csv该列中某行的值是“0001.txt”,那么该列该行要替换成的就是0001.txt这个文件中的内容

txt文件中的内容和csv没有什么对应,是一些html代码。
作者: pcl_test    时间: 2015-2-12 18:58

回复 3# nancyaa
每个txt里的内容有许多行吗?
作者: nancyaa    时间: 2015-2-12 19:18

回复 4# pcl_test

txt中大部分内容是这样的:
<p><span style="background-color: #ffffff; color: #ffffff;">1<img src="http://隐去.jpg" height="551" width="600" /></span></p>

断行可能会有吧……还是万无一失的好
作者: pcl_test    时间: 2015-2-12 20:26

回复 5# nancyaa

测试前先备份原文件,把txt、csv和批处理放在一起运行
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%a in ('dir /b *.txt') do (
  4. for /f "tokens=1* delims=: " %%z in ('findstr /n /c:"%%~na" "test.csv"') do set m=%%z
  5. set /p str=<"%%a"
  6. set n=1
  7. cd.>$
  8. for /f "tokens=1* delims=," %%i in ('type "test.csv"') do (
  9. if !n!==!m! (
  10. >>$ echo,%%i,"!str!"
  11. ) else (
  12. >>$ echo,%%i,%%j
  13. )
  14. set /a n+=1
  15. )
  16. move $ "test.csv"
  17. )
  18. pause
复制代码

作者: yiwuyun    时间: 2015-2-12 21:11

  1. gawk "BEGIN{FS=OFS=\",\";}{a=gensub(/^\"(.*)\"$/,\"\\1\",1,$2);if(a){if((getline line <a)>0){line=sprintf(\"\\\"%%s\\\"\",line);print $1,line;close(a);}}else{print $0;}}" test.csv
  2. pause
复制代码

作者: nancyaa    时间: 2015-2-13 14:51

回复 7# yiwuyun

运行失败,提示"gawk" 不是内部或外部命令,也不是可运行的程序或批处理文件.
另外如果要替换的内容在一个大表的某一列,比如第32列,应该怎么写呢
作者: nancyaa    时间: 2015-2-13 14:52

回复 6# pcl_test
谢谢大神,我运行了一下,真的有填到第二列,虽然实际的description列在32列。但是内容少了第一个字符(一般是<这个符号),最后多了个"字符。

另外,要替换在第32列的话,应该怎么写呢。
作者: nancyaa    时间: 2015-2-26 15:31

问题没有解决...顶一下
作者: CrLf    时间: 2015-2-26 16:23

本帖最后由 CrLf 于 2015-2-26 20:14 编辑

JSConsole 可以这样:
  1. var csv = type('a.csv')
  2. csv = csv.replace(/"(.+?)"/g,function($0,$1){return isFile($1)?'"'+type($1)+'"':$0})
  3. create('a.csv',true).Write(csv)
复制代码
或者用骚包一点的写法像这样:
  1. var list = dir().files().grep(/\.txt$/i)
  2. //找出 txt 文件,返回数组
  3. var text = list._EACH(type)
  4. //取得文本内容,返回数组
  5. var obj = {}
  6. for(var i in list){obj[list[i]]=text[i]}
  7. //将两个数组合并为一个对象
  8. var csv = type('a.csv')
  9. csv = csv.replace(/"(.+?)"$/g,function($0,$1){return $1 in obj?'"'+obj[$1]+'"':$0})
  10. //对 csv 进行替换
  11. create('a.csv',true).Write(csv)
  12. //保存回 csv
复制代码

作者: tigerpower    时间: 2015-2-26 19:58

本帖最后由 tigerpower 于 2015-7-4 07:28 编辑

powershell
  1. $i=32;$f="filename.csv";$t=1;(gc $f)[$t..($f.length)]|%{$r=$_.split(',');$r[$i-1]=(gc $r[$i-1].trim(' "')) -join '';$r -join ',';}
复制代码

作者: DAIC    时间: 2015-2-26 20:46

回复 8# nancyaa


    下载一个 gawk.exe 放到 C:\Windows\System32 目录下面可以解决这个报错
作者: nancyaa    时间: 2015-3-2 12:41

回复 12# tigerpower

不能对值为空的表达式调用方法。
所在位置 行:1 字符: 96
+ $i=32;$f="test.csv";$t=2;(gc $f)[$t..($f.length)]|%{$r=$_.split(',');$r[$i-1]
=(gc $r[$i-1].trim <<<< (' "')) -join '';$r -join ',';}
    + CategoryInfo          : InvalidOperation: (trim:String) [], RuntimeExcep
   tion
    + FullyQualifiedErrorId : InvokeMethodOnNull

相关的几列都没有空格呢
作者: nancyaa    时间: 2015-3-2 13:01

回复 7# yiwuyun

装好gawk了,提示:
无法将“.*”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写
,如果包括路径,请确保路径正确,然后重试。
所在位置 行:1 字符: 44
+ gawk "BEGIN{FS=OFS=\",\";}{a=gensub(/^\"(.* <<<< )\"$/,\"\\1\",1,$32);if(a){i
f((getline line <a)>0){line=sprintf(\"\\\"%%s\\\"\",line);print $1,line;close(a
);}}else{print $0;}}" test.csv
    + CategoryInfo          : ObjectNotFound: (.*:String) [], CommandNotFoundE
   xception
    + FullyQualifiedErrorId : CommandNotFoundException

*改成txt也是类似的报错




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