中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [求助]txt转csv的问题 上一主题 | 下一主题
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『楼 主』:  [求助]txt转csv的问题

一目录下有许多文本文件,格式相同,内容如下:
5411|54110000377889|0|30000.0|2006/09/29|88130095863129|2008/09/27|0.0|0.0|罗宗良|
54110000410360|5411|88130114562095|0|敬永猛|60000.0|2007/05/31|2009/05/29|0.0|0.0|
5411|88130122241160|0|30000.0|2007/08/28|2008/08/27|0.0|54110000744667|798.53|李国富|
要将此文本文件转换为Excel的csv.文件,我写如下代码:
for %%a in (*.txt) do (
  for /f "delims=" %%h in (%%a) do (
    set var=%%h
    setlocal enabledelayedexpansion
   set var=!var:^|=,!
   echo.!var!>>"%%~na_new%%.csv"
   endlocal   
  )
)
pause
转换成功了,可打开csv文件后,凡单元格内数字位数超过11位的数字全部成了科学计数。
我现在要做的是在数字位数超过11位的数字前加一个单引号“'”,转换成如下:
5411,'54110000377889,0,30000.0,2006/09/29,'88130095863129,2008/09/27,0.0,0.0,罗宗良,
'54110000410360,5411,'88130114562095,0,敬永猛,60000.0,2007/05/31,2009/05/29,0.0,0.0,
5411,'88130122241160,0,30000.0,2007/08/28,2008/08/27,0.0,'54110000744667,798.53,李国富,
请教代码如何写?

2008-10-22 13:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

这样能满足要求么?
@echo off
for %%a in (*.txt) do (
  for /f "delims=" %%h in (%%a) do (
    set var=%%h
    setlocal enabledelayedexpansion
    set var=!var:^|=,'!
    echo.'!var!>>"%%~na_new%%.csv"
    endlocal   
  )
)




2008-10-22 13:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 3 楼』:  

你这个是把所有的数字和汉字前都加了一个单引号。
我希望只是在数字位数超过11位的数字加引号,能行吗?

2008-10-22 14:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  Re 3楼

批处理计算字符串的长度是一件比较浪费资源的操作,当数据量比较大的时候尤为明显。
如果一定要这样,可在本版搜索字符串长度



2008-10-22 15:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 5 楼』:  

那能不能这样:只给第二列、第三列和第五列的字符前加单引号?
例将下面:
5426|47960000132016|88130097408157|0|88130140097408134|45000.0|兰林|
5426|48320000038190|88130097413071|0|88130140097413048|10000.0|王培杰|
5426|48360000105672|88130097505153|0|88130140097505130|2220.0|张勇|


转换成:
5426,'47960000132016,'88130097408157,0,'88130140097408134,45000.0,兰林,
5426,'48320000038190,'88130097413071,0,'88130140097413048,10000.0,王培杰,
5426,'48360000105672,'88130097505153,0,'88130140097505130,2220.0,张勇,
[ Last edited by hgx126 on 2008-10-22 at 15:35 ]

2008-10-22 15:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  



  Quote:
E:\>gawk --posix --re-interval -F"|" -v OFS=, "{for(i=1;i<=NF;i++)if($i~/^[0-9.]{9,}/)$i=\"'\"$i;print}" your_file.txt
5411,'54110000377889,0,30000.0,2006/09/29,'88130095863129,2008/09/27,0.0,0.0,罗宗良,
'54110000410360,5411,'88130114562095,0,敬永猛,60000.0,2007/05/31,2009/05/29,0.0,0.0,
5411,'88130122241160,0,30000.0,2007/08/28,2008/08/27,0.0,'54110000744667,798.53,李国富,

E:\>



2008-10-26 19:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
longge0000
初级用户





积分 24
发帖 11
注册 2008-10-14
状态 离线
『第 7 楼』:  Re 5楼



  Quote:
Originally posted by hgx126 at 2008-10-22 15:22:
那能不能这样:只给第二列、第三列和第五列的字符前加单引号?

[code]
例将下面:
5426|47960000132016|88130097408157|0|88130140097408134|45000.0|兰林|
5426|4832 ...

比较笨的方法,有没有高手来简化下:
echo off
for %%a in (*.txt) do (
  for /f "delims=| tokens=1,2,3,4,5,*" %%b in (%%a) do (
    setlocal enabledelayedexpansion
    set  var2=%%c & set var2=!var2:~12!
    set  var3=%%d & set var3=!var3:~12!
    set  var5=%%f  & set var5=!var5:~12!
    set  var6=%%g
   
    if defined var2 (set var2='%%c) else (set var2=%%c)
    if defined var3 (set var3='%%d) else (set var3=%%d)
    if defined var5 (set var5='%%f) else (set var5=%%f)
    set var6=!var6:^|=,!
    echo %%b,!var2!,!var3!,%%e,!var5!,!var6!>>"%%~na_new%%.csv"
    endlocal   
  )
)
pause

2008-10-26 21:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 8 楼』:  



  Quote:
E:\>gawk --posix --re-interval -F"|" -v OFS=, "{for(i=1;i<=NF;i++)if($i~/^[0-9.]{9,}/)$i=\"'\"$i;print}" your_file.txt
5411,'54110000377889,0,30000.0,2006/09/29,'88130095863129,2008/09/27,0.0,0.0,罗宗良,
'54110000410360,5411,'88130114562095,0,敬永猛,60000.0,2007/05/31,2009/05/29,0.0,0.0,
5411,'88130122241160,0,30000.0,2007/08/28,2008/08/27,0.0,'54110000744667,798.53,李国富,

E:\>


利用的是外部命令吗?看不懂能不能解释一下?

2008-10-29 23:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 9 楼』:  Re 8楼

gawk.exe可以去这里下载:批处理室附件收集专用帖

这个命令比较复杂,靠别人讲是学不会的,自己先看看帮助吧。



2008-10-30 00:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 10 楼』:  

搜索gawk  http://www.cn-dos.net/forum/sear ... mp;searchsubmit=yes




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2008-10-30 01:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 11 楼』:  

基本满足(没特殊字符的话)  但文件大的话  BAT的效率还是问题
@echo off
for %%i in (*.txt) do (
  for /f "usebackq delims=" %%a in ("%%i") do (
    set var=%%a
    setlocal enabledelayedexpansion
    set var=!var:^|= !
    for %%b in (!var!) do (
    for /f "skip=1 delims=:" %%c in ('^(echo "%%b"^&echo.^)^|findstr /o ".*"') do (
    set/a n=%%c-5
    if !n! gtr 11 (set "str=!str!'%%b,")else set "str=!str!%%b,"
    ))
    >>"%%~ni_new.csv" echo !str!
    endlocal   
  )
)
pause




简单!简单!再简单!
2008-10-30 02:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: