Board logo

标题: 把CSV文件转成想要的格式 [打印本页]

作者: zouzhxi     时间: 2007-4-3 07:21    标题: 把CSV文件转成想要的格式
请看 www.cn-dos.net/forum/viewthrea ... 能不能写一个P,把CSV文件转成TEL.DB的格式呀....
CSV格式如下: 姓名,手机号码1,手机号码2,住宅电话,办公室电话,传真,电子邮件,家庭地址,录入时间 zouzhxi,1234567890123,1234567890124,12345678,12345679,12345678,zouzhxi@163.com,深圳大学,2007-04-02 如果没有的话,就留空.: 姓名,手机号码1,,,办公室电话,,电子邮件,家庭地址,录入时间 zouzhxi,1234567890123,,,12345679,,zouzhxi@163.com,深圳大学,2007-04-02
TEL.DB格式如下: ::电话本数据库 -------------------------------------------------- zouzhxi:1234567890123:: 姓名:   [zouzhxi] 手机号码 1:[1234567890123] 手机号码 2:[1234567890124] 住宅电话: [12345678] 办公室电话:[12345679] 传真:   [12345678] 电子邮件: [zouzhxi@163.com] 家庭地址: [深圳大学] 录入日期: [2007-04-02] -End-

作者: flyinspace     时间: 2007-4-3 07:38
可以写的。你可以自己试着写一下。。。

作者: zouzhxi     时间: 2007-4-3 08:01
就是在处理“,”出错了。。。没弄出来。。。如果是完整的就可以。。。可是里边要是有空位的话,就出错了。。。郁闷ing...

作者: vkill     时间: 2007-4-3 10:12
先每两行为单位,call ,后替换,,为,空, 这样就可以for /f 来 set 了,然后set/p 就ok了

作者: estar     时间: 2007-4-3 10:28
你那个 CSV 有没有出现空格、引号等特殊字符之类的情况?如果没有的话正则一句就搞定了

作者: vkill     时间: 2007-4-3 11:04
剩下的你自己修改下应该可以的
@echo off&SETLOCAL ENABLEDELAYEDEXPANSION
set life=test.txt
set "fl=姓名,手机号码1,手机号码2,住宅电话,办公室电话,传真,电子邮件,家庭地址,录入时间"
set n=0
for %%? in (%fl%) do (
  set/a n+=1
  set "d!n!=%%?"
                     ) 

set n=0
:loop
set/a n+=2
for /f "tokens=*" %%? in ('findstr /N "." c.txt^|findstr "^%n%"') do (call :替换 "%%?")
for /f "tokens=2* delims=:" %%? in ('set v^|findstr "^v="') do (
 for /f "tokens=1-9 delims=," %%a in ('set/p^=^%%?^<nul') do (
  set "b1=%%a"
  set "b2=%%b"
  set "b3=%%c"
  set "b4=%%d"
  set "b5=%%e"
  set "b6=%%f"
  set "b7=%%g"
  set "b8=%%h"
  set "b9=%%i"
                                               )
                                                                )

>>%life% set/p=^!b1!的通讯录<nul
>>%life% echo.
for /l %%? in (1,1,9) do (
  >>%life% set/p=^!d%%?!: [!b%%?!]<nul
  >>%life% echo.
                         )
>>%life% echo.
>>%life% echo.
 
pause
goto loop

:替换
set "v=%~1"
:loop_替换
set "v=!v:,,=,空,!"
set v|findstr "^v="|findstr ",," >nul 2>nul &&goto loop_替换
goto :eof

作者: lxmxn     时间: 2007-4-3 13:35    标题: 替namejm兄发的一个回贴
@echo off
::Code by namejm
setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.csv) do (
    set /a num+=1
    if !num! equ 1 set str1=%%i
    if !num! equ 2 (
        set str2=%%i
        set num=0
        set str1=!str1:,=\!
        set str2=!str2:,=\!
        call :translate
    )
    echo.
)
echo.
pause
exit

:translate
set /a num+=1
for /f "delims=" %%i in ("%str1%") do (
    set var%num%=%%~ni:  
    set str1=%%~dpi
    set str1=!str1:~0,-1!
)
for /f "delims=" %%i in ("%str2%") do (
    set var_%num%=%%~ni
    set str2=%%~dpi
    set str2=!str2:~0,-1!
)
if /i not "%str1%"=="%cd%" goto translate
for /l %%i in (%num%,-1,1) do echo !var%%i!	[!var_%%i!]
set num=0
goto :eof

作者: flyinspace     时间: 2007-4-3 15:10
因为 for 语句里面对空格也做为分割行。 所以。我一般在这种情况下会采用其他的方案执行。。

作者: zouzhxi     时间: 2007-4-3 21:54
Re:6F 你的P处理,基本能成功,,但是如果有很多的话,,,用PAUSE就觉得很麻烦了...如果我去掉的话,,,,会在最后一个结果做死循环......能不能改进一下.... Re:7F 你的不行...第一个联系人的资料会和第二个联系的资料连在一起,,,而第二个也和第三个连在一起.... 还有就是我想问一下,就是怎么知道这个CSV文件里边有多少行记录.... [ Last edited by zouzhxi on 2007-4-3 at 10:31 PM ]

作者: zouzhxi     时间: 2007-4-4 03:13
没人回答????

作者: digger     时间: 2007-4-4 06:52
7F的代码能处理顶楼的文本内容啊。如果不能处理你的文件,那就是你的文件内容格式比较复杂,和顶楼的例子有出入,最好的办法是把你的文件发出来让大家看看。

作者: vkill     时间: 2007-4-4 08:18
Originally posted by zouzhxi at 2007-4-3 21:54: Re:6F 你的P处理,基本能成功,,但是如果有很多的话,,,用PAUSE就觉得很麻烦了...如果我去掉的话,,,,会在最后一个结果做死循环......能不能改进一下.... R ...
倒,给你的已经很详细了啊~你自己修改下不就可以了 加2一句 if "%~1"=="" exit/b 就好了 [ Last edited by vkill on 2007-4-4 at 08:19 AM ]

作者: digger     时间: 2007-4-4 08:42
难道楼主是把每个联系人的信息分别保存为对应的文件? [ Last edited by digger on 2007-4-3 at 07:53 PM ]