如何在某些文本之前在批处理文件输出txt文件中包含空格或任何特殊字符?

时间:2016-05-03 09:31:20

标签: batch-file batch-processing

我正在使用命令

运行批处理文件
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 - >列我可以分开字段。为此,可以在GEOGCS - Datum - Spehroid之前包含空格或任何特殊字符,以便我可以使用文本轻松地将其分开 - > excel中的列选项

我更喜欢这种格式

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]] 

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

1 个答案:

答案 0 :(得分:2)

命令 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 /?

另请参阅Microsoft关于Using command redirection operators的文章。