【问题标题】:Replace specific text in csv via commandline通过命令行替换 csv 中的特定文本
【发布时间】:2013-12-16 07:08:42
【问题描述】:

我有从 SQL Server 获取输出的 csv 格式的数据。数据有一些写出的NULLN.A. 值,它们构成了列字符类型——否则它只会由整数组成。是否可以通过批处理文件语句来查找这些值并将其替换为数字 - 例如,-1 表示NULL,-2 表示N.A.。以下是数据现在的样子:

    Col A,  Col B,  Col C,  Col D,  Col E,  Col F,  Col G,  Col H
    NULL,   13,     11,     N.A.,   4710,   N.A.,   1,      1
    5,      NULL,   13,     7070,   N.A.,   4920,   N.A.,   1
    5,      NULL,   12,     8680,   N.A.,   9130,   N.A.,   1

我想把它转换成这个:

    Col A,  Col B,  Col C,  Col D,  Col E,  Col F,  Col G,  Col H
    -1,     13,     11,     -2,     4710,   -2,     1,      1
    5,      -1,     13,     7070,   -2,     4920,   -2,     1
    5,      -1,     12,     8680,   -2,     9130,   -2,     1

通过批处理语句执行此操作很重要,因为这是一个中间输出,并且会立即被另一个程序读入。我查看了findstr 命令(http://technet.microsoft.com/en-us/library/bb490907.aspx),但我知道如何编写确切的语法并执行替换操作。非常感谢有用的输入!

【问题讨论】:

  • 我面前没有一台 Windows 机器来破解这个,但我想你需要使用 for 命令来遍历文件中的行并在输出令牌时修改它们。您还需要注意EnableDelayedExpansion 如何影响循环内的行为。如果您可以修改 SQL 查询以产生您想要的结果,这将是一项容易得多的任务。此外,由于您使用的是 Windows 命令行,请考虑运行 cscript 的 Windows 脚本主机

标签: batch-file csv command-line replace findstr


【解决方案1】:

这使用了一个名为 repl.bat 的辅助批处理文件,来自 - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

repl.bat 放在与批处理文件相同的文件夹中或路径上的文件夹中。

它应该更健壮和更快。

type file.csv |repl "NULL" "-1" |repl "N\.A\." "-2" >newfile.csv

【讨论】:

  • 这个文件的替换速度真的很快!!
  • 它实际上是在一个混合批处理文件中通过Windows Scripting Host 使用Jscript,因此它比批处理代码快得多,并且没有毒字符-但仍然易于使用。 Aacini 使用相同的技术设计了findrepl.bat,这是一个类似于grep 的工具。 dbenham 写了repl.bat
【解决方案2】:
@echo off
    setlocal enableextensions enabledelayedexpansion

    (for /f "tokens=*" %%f in (a.csv) do if not "%%f"=="" (
            set "line=%%f"
            set "line=!line:NULL=-1!"
            set "line=!line:N.A.=-2!"
            echo(!line!
    )) > b.csv

    endlocal

如果如 OP 所述,文件采用指示的格式,仅包含整数、NULL 和 N.A.,或者至少不包含特殊字符,这将起作用。

【讨论】:

  • 这个肯定比@Dale的版本快。
【解决方案3】:

试试这个:

@echo off
setLocal enableDelayedExpansion

set filename=input.txt
set originalText1=NULL
set "replacedText1=-1"
set "originalText2=N.A."
set "replacedText2=-2"

for /f "tokens=*" %%a in ('type %filename%') do (
    set "line=%%a"
    if defined line (
        call set "line=%%line:%originalText1%=%replacedText1%%%"
        call set "line=%%line:%originalText2%=%replacedText2%%%"
        echo !line!>> output.txt
    ) else (
        echo.
    )
)

此代码将帮助您将NULL 的所有实例替换为-1N.A.-2。然后将结果存储在output.txt 中。希望对您有所帮助。

附:请注意,调用集是必需的,因为它将扩展在同一行上传递的变量。

【讨论】:

  • +1 表示正确的方向,但检查@MCND 代码执行单个> 写入,而不是多个>> 并避免type 命令。
猜你喜欢
  • 2011-02-01
  • 1970-01-01
  • 2010-10-06
  • 2014-11-03
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多