【问题标题】:How to include space or any special character in a batch file output txt file before certain texts?如何在某些文本之前在批处理文件输出 txt 文件中包含空格或任何特殊字符?
【发布时间】:2016-05-03 09:31:20
【问题描述】:

我正在使用命令运行批处理文件

for /R .\ %%f IN ("*.tab") DO (echo File: %%f & gdalsrsinfo -o wkt "%%f") >>U:\srsinfo.csv

输出是

File: D:\QAQC\Old\1M_AGSO_Railways_Aust.TAB
GEOGCS["unnamed",DATUM["North_American_Datum_1983",SPHEROID["GRS 80",6378137,298.257222101],TOWGS84[0,0,0,-0,-0,-0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]
File: D:\RTXQAQC\Old\1M_AGSO_Roads_Aust.TAB
GEOGCS["unnamed",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563],TOWGS84[0,0,0,-0,-0,-0,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]]

现在,我想要单独的文件名,并且之前它应该在一行中。这样使用 texy -> columns 我可以分隔字段。为此,是否可以在 GEOGCS - Datum - Spehroid 之前包含空格或任何特殊字符,以便我可以使用 excel 中的 text -> columns 选项轻松分隔它

我更喜欢这种格式

1M_AGSO_Railways_Aust.TAB ***SPACE*** GEOGCS["unnamed",DATUM["North_American_Datum_1983" ***SPACE***SPHEROID["GRS 80",6378137,298.257222101] ***SPACE*** TOWGS84[0,0,0,-0,-0,-0,0]] 

基本上在每个参数之前,我需要一个空格来分隔使用文本到列选项

【问题讨论】:

  • 如果您另外发布到您当前获得的输出以及您想要的格式的输出,我们会更清楚。
  • 我已经编辑了这个问题。不知道为什么 Space 没有加粗和斜体

标签: batch-file batch-processing


【解决方案1】:

命令 FOR 可用于将写入stdout 的控制台应用程序的输出重定向到循环或环境变量以进行进一步处理。

我提供了两种解决方案来获取 CSV 文件,其中感兴趣的数据由水平制表符分隔。

解决方案 1 使用逗号作为分隔符将行拆分为感兴趣的数据。

@echo off
set "Separator= "
if exist U:\srsinfo.csv del U:\srsinfo.csv
for /R .\ %%# in (*.tab) do (
    for /F "tokens=1-14 delims=," %%A in ('gdalsrsinfo.exe -o wkt "%%#"') do (
        echo %%~nx#%Separator%%%A,%%B%Separator%%%C,%%D,%%E%Separator%%%F,%%G,%%H,%%I,%%J,%%K,%%L
    )
) >>U:\srsinfo.csv
set "Separator="

注意:第二行等号后的字符必须是水平制表符,而不是浏览器根据HTML标准显示的空格字符。

由于数据行包含的逗号多于用于插入 CSV 分隔符的逗号,因此需要大量标记(分配给循环变量的字符串)才能获得所需的输出。

解决方案 2 按关键字分隔数据。

@echo off
setlocal EnableDelayedExpansion
set "Separator= "
if exist U:\srsinfo.csv del U:\srsinfo.csv
for /R .\ %%# in (*.tab) do (
    for /F "delims=" %%L in ('gdalsrsinfo.exe -o wkt "%%#"') do (
        set "DataRow=%%L"
        set "DataRow=!DataRow:,SPHEROID=%Separator%!
        set "DataRow=!DataRow:,TOWGS84=%Separator%!
        set "DataRow=!DataRow:,PRIMEM=%Separator%!
        for /F "tokens=1-3 delims=%Separator%" %%A in ("!DataRow!") do (
            echo %%~nx#%Separator%%%A%Separator%SPHEROID%%B%Separator%TOWGS84%%C
        )
    )
) >>U:\srsinfo.csv
endlocal

注意:第三行等号后的字符必须是水平制表符。

此解决方案用分隔符替换关键字和关键字左侧的逗号,并将结果分配给环境变量DataRow。完成必要的分离后,再使用一个 FOR 命令来获取 CSV 文件的行,其中再次添加了关键字并仅包含感兴趣的数据。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • for /? ...还解释了%~nx#(只是文件的名称和扩展名,没有驱动器和路径)
  • if /?
  • set /?
  • setlocal /?

还可以查看有关 Using command redirection operators 的 Microsoft 文章。

【讨论】:

  • 非常感谢你的朋友。帮了我很多。工作完美。我正在使用第一个代码
猜你喜欢
  • 2016-02-25
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多