【问题标题】:Batch file to process csv document to add space in postcode field批处理文件以处理 csv 文档以在邮政编码字段中添加空间
【发布时间】:2015-06-02 20:30:24
【问题描述】:

我有一个包含姓名、地址和邮政编码的 csv 文件。大量邮政编码之间没有所需的空间,例如 LU79GH 应该是 LU7 9GH 而 W13TP 应该是 W1 3TP。如果每个邮政编码字段不存在,我需要在每个字段中添加一个空格,该空格应始终位于最后 3 个字符之前。

通过 Windows 命令行解决此问题的最佳方法是什么? 非常感谢

【问题讨论】:

    标签: windows batch-file command-line cmd formatting


    【解决方案1】:

    您可以使用for /f 执行此操作,如下所示:

    @echo off
    setlocal enabledelayedexpansion
    
    if "%~1" equ "" (echo.%~0: usage: missing file name.& exit /b 1)
    if "%~2" neq "" (echo.%~0: usage: too many arguments.& exit /b 1)
    
    for /f %%i in (%~1) do (echo.%%i& goto :afterheader)
    :afterheader
    for /f "skip=1 tokens=1-3 delims=," %%i in (%~1) do (
        set name=%%i
        set address=%%j
        set postcode=%%k
        set postcode=!postcode: =!
        echo.!name!,!address!,!postcode:~0,-3! !postcode:~-3!
    )
    
    exit /b 0
    

    演示:

    > type data.csv
    name,address,postcode
    n1,a1,LU79GH
    n2,a2,W13TP
    n1,a1,LU7 9GH
    n2,a2,W1 3TP
    
    > .\add-space.bat data.csv
    name,address,postcode
    n1,a1,LU7 9GH
    n2,a2,W1 3TP
    n1,a1,LU7 9GH
    n2,a2,W1 3TP
    

    您可以将输出重定向到文件以捕获它。 (但是您不能重定向到与输入相同的 文件,因为这样重定向会在脚本读取之前覆盖输入文件。如果要覆盖原始文件,则可以将输出重定向到新文件,然后在脚本完成后将新文件移到原始文件上。)

    【讨论】:

    • 您假设邮政编码总是缺少空格,但它可能已经存在。此外,地址字段可能是包含逗号的带引号的值,这将导致 FOR /F 解析失败。
    • @dbenham,谢谢!我没有注意到这些问题。刚才我用替换扩展修复了它们中的第一个。带有嵌入逗号的潜在引用地址的问题很棘手,并且很难在纯 dosbatch 中解决。
    • 感谢您的帮助。
    【解决方案2】:

    使用 Windows,您可以使用 Powershell 做一些事情。

    $document = (Get-Content '\doc.csv')
    foreach($line in $document) {
        Write-Host $line
        // Add logic to cut out exactly what column your looking at with 
        $list = $line -split","
        // Then use an if statement and regular expression to match ones with no space
        if($list[0] -match ^[A-Z0-9]$){
        // item has no space add logic to add space and write to file
        }else{
        // item has space or doesnt match the above regular expression could skip this 
        }
    }
    

    相当不错的在线文档,请查看http://ss64.com/ps/ 以获取有关 powershell 的帮助。

    【讨论】:

      【解决方案3】:

      解析 CSV 可能会很棘手,因为逗号可能是列分隔符,也可能是带引号的字段中的文字字符。

      由于您的邮政编码始终是最后一个字段,因此我只需查看整行末尾的第 4 个字符,如果它还不是空格,则在该行的最后 3 个字符之前插入一个空格。我还将假设文件的第一行列出了字段名称,因此您不想修改那个。

      使用纯批处理(假设没有值包含!):

      @echo off
      setlocal enableDelayedExpansion
      set "skip=true"
      >"test.csv.new" (
        for /f "usebackq delims=" %%A in ("test.csv") do (
          set "line=%%A"
          if "!line:~-4,1!" equ " " set "skip=true"
          if defined skip (echo !line!) else (echo !line:~0,-3! !line:~-3!)
          set "skip="
        )
      )
      move /y "test.csv.new" "test.csv" >nul
      

      如果您使用我的JREPL.BAT 正则表达式文本处理器,解决方案会更简单。它是一个纯脚本(混合 JScript/batch),可以在 XP 以后的任何 Windows 机器上本地运行。以下一个班轮可以解决问题:

      jrepl "[^ ](?=...$)" "$& " /jbegln "skip=(ln==1)" /f test.csv /o -
      

      如果您在另一个脚本中使用该命令,请使用 CALL JREPL ...

      【讨论】:

      • 感谢您的帮助。
      猜你喜欢
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多