循环通过CSV文件与批处理 - 空间问题 [英] Loop through CSV file with batch - Space issue

查看:121
本文介绍了循环通过CSV文件与批处理 - 空间问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的csv文件

 姓名,性别,年龄
venu,m,16
test ,, 22



名称也可以有逗号

 venu,gopal,m,16 

我想处理如果sex什么都不保存到另一个文件。



我有一个像这样的脚本

  @Echo Off 
For / Fusebackq tokens = 1-3 delims =,%% a in(test.csv)Do(
echo %% a,%% b,%% c>> test-new .csv

但对于第三条记录,我得到%% b为22这应该是空间。如何解决此问题?





那个链接。我不知道我做错了什么。我得到同样的问题。请检查一次。

  @echo off 
setlocal DisableDelayedExpansion

For / F usebackq tokens = 1-3 delims =%% x in(C:\somefile.csv)Do(

setlocal EnableDelayedExpansion
setvar = %% x

setvar =!var:=!
setvar =!var:^ = ^^!
setvar =!var:& = ^& ;!
setvar =!var:| = ^ |!
setvar =!var:< = ^< ;!
setvar =!var: > = ^> ;!
setvar =!var :, = ^,^ ,!
set var =!var:=!
setvar = !var:=Q!
setvar =!var:,, =SS!
setvar =!var:^,^,= ,! b $ b setvar =!var:=!
setvar =!var:Q =!


For / Ftokens = 1-3 delims =,%% a in(!var:SS =,!)Do(
endlocal
echo %%〜a,%%〜b, %〜c
setlocal EnableDelayedExpansion
pause


endlocal



解决方案

这有点棘手,因为多个delims会被压缩成单个分界符。



因此,您需要将其替换为唯一 delim序列。

  @Echo Off 
setlocal DisableDelayedExpansion
For / Fusebackq tokens = 1-3 delims =%% a in(test.csv)Do(
setline = %% a
setlocal EnableDelayedExpansion
setline =!line:,=,!
For / Ftokens = 1-3 delims = %% a in(!line!)Do(
echo %%〜a,%%〜b,%%〜c


这将每个列括在引号中,并且使用 %%〜a


$ b 这种情况与如何拆分CMD shell中的';'的解决方案只有一点不同。

  @echo off 
setlocal DisableDelayedExpansion

For / Fusebackq tokens = 1-3 delims =% %x in(test.csv)Do(
setvar = %% x
setlocal EnableDelayedExpansion
setvar =!var:^ = ^^!
set var =!var:& = ^& ;!
setvar =!var:| = ^ |!
setvar =!var:< = ^< ;!
setvar =!var:> = ^> ;!
setvar =!var :, = ^,^ ,!
rem ** ,缺少的引用是intent
call set var = %% var:=%%
setvar =!var:=Q!
setvar =! var:^,^,=C!
setvar =!var:,, = ,!
setvar =!var:=!
b $ b setvar =!var:,=,!
for / Ftokens = 1-3 delims =,%% a in(!var! b $ b endlocal
setcol1 = %%〜a
setcol2 = %%〜b
setcol3 = %%〜c
setlocal EnableDelayedExpansion
如果定义了col1(
设置col1 =!col1:C = ,!
设置col1 =!col1:Q =!


如果定义col2(
设置col2 =!col2:C = ,!
设置col2 =!col2:Q =!


如果定义col3(
设置col3 =!col3:C = ,!
设置col3 =!col3:Q =!

echo a =!col1 !, b =!col2 !, c =!col3!
endlocal



I have a csv file like this

name,sex,age
venu,m,16
test,,22

[EDIT]
name could have comma also

"venu,gopal",m,16

I want to handle if sex is nothing and save it to another file.

I have a script like this

@Echo Off
For /F "usebackq tokens=1-3  delims=," %%a in (test.csv) Do (
   echo %%a, %%b, %%c >> test-new.csv
)

But for the third record, I am getting %%b as 22 which should be space. How to fix this?

[EDIT2]

I have tried as per that link. I am not sure what I am doing wrong. I am getting same issue. Please check it once.

@echo off
setlocal DisableDelayedExpansion

For /F "usebackq tokens=1-3 delims=" %%x in (C:\somefile.csv) Do (

    setlocal EnableDelayedExpansion
    set "var=%%x"   

    set "var=!var:"=""!"
    set "var=!var:^=^^!"
    set "var=!var:&=^&!"
    set "var=!var:|=^|!"
    set "var=!var:<=^<!"
    set "var=!var:>=^>!"
    set "var=!var:,=^,^,!"
    set var=!var:""="!
    set "var=!var:"=""Q!"
    set "var=!var:,,="S"S!"
    set "var=!var:^,^,=,!"
    set "var=!var:""="!"
    set "var=!var:"Q=!"


    For /F "tokens=1-3  delims=," %%a in ("!var:"S"S=","!") Do (
      endlocal
      echo %%~a, %%~b, %%~c
      setlocal EnableDelayedExpansion
      pause
    )

    endlocal

)

解决方案

This is a bit tricky, as multiple delims will be condensed to a single delim.

So you need to replace them before to a unique delim sequence.

@Echo Off
setlocal DisableDelayedExpansion
For /F "usebackq tokens=1-3  delims=" %%a in (test.csv) Do (
    set "line=%%a"
    setlocal EnableDelayedExpansion
    set "line="!line:,=","!""
    For /F "tokens=1-3  delims=," %%a in ("!line!") Do (
        echo %%~a, %%~b, %%~c 
    )
)

This enclose each column into quotes, and with the %%~a the quotes will be removed later

EDIT: The solution for embedded commas

In this case it's only a bit different than the solution for how to split on ';' in CMD shell

@echo off
setlocal DisableDelayedExpansion

For /F "usebackq tokens=1-3 delims=" %%x in (test.csv) Do (
    set "var=%%x"
    setlocal EnableDelayedExpansion
    set "var=!var:^=^^!"
    set "var=!var:&=^&!"
    set "var=!var:|=^|!"
    set "var=!var:<=^<!"
    set "var=!var:>=^>!"
    set "var=!var:,=^,^,!"
    rem ** This is the key line, the missing quote is intention
    call set var=%%var:""="%%
    set "var=!var:"="Q!"
    set "var=!var:^,^,="C!"
    set "var=!var:,,=,!"
    set "var=!var:""="!"

    set "var="!var:,=","!""
    for /F "tokens=1-3 delims=," %%a in ("!var!") do (      
        endlocal
        set "col1=%%~a"
        set "col2=%%~b"
        set "col3=%%~c"
        setlocal EnableDelayedExpansion
        if defined col1 (
            set "col1=!col1:"C=,!"
            set "col1=!col1:"Q="!"
        )

        if defined col2 (
            set "col2=!col2:"C=,!"
            set "col2=!col2:"Q="!"
        )

        if defined col3 (
            set "col3=!col3:"C=,!"
            set "col3=!col3:"Q="!"
        )
        echo a=!col1!, b=!col2!, c=!col3!
        endlocal
    )
)

这篇关于循环通过CSV文件与批处理 - 空间问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆