2012-06-10 167 views
0

编辑问题:批次:更改制表符分隔到管道分隔

现在,我可以从标签更改为管道分隔。但数据在文本之后有空间。如何在蝙蝠中添加代码以修剪空间?

原题:

我想每晚创建批处理过程中改变,通过分隔,以管道分隔片单独的文本文件。 如果数据在文本之后有空格。如何修剪空间?

前:

文件名:Customer_Tab.pwf - >这是文本文件

数据,通过标签单独列定界:

Customer Number Customer Name Partner Number Partner Name Customer Country 

1ABC Jame 1234 Anny USA 

2DEF Susan 5678 Prissy UK 

转换为通过管道单独的数据分隔

文件名:Customer_Pipe.csv

数据:

Customer Number|Customer Name|Partner Number|Partner Name|Customer Country 

1ABC|Jame|1234|Anny|USA 

2DEF|Susan|5678|Prissy|UK 

请帮我创建批处理。

我不知道如何为这个问题创建批处理。 非常感谢提前。

回答

0

我不知道如何通过批处理文件做到这一点,但如果你已经在系统上安装PHP,你可以使用简单地从你的批处理文件中这样调用一个小PHP脚本:

[convert.batch] 
php -f covert.php 

[convert.php] 
<?php 
// read entire file into an array 
$rows = file('Customer_Tab.pwf'); 
// create output file 
$fp = fopen('Customer_Pipe.csv', 'w'); 
foreach($rows as $row) { 
    // replace tabs with pipes 
    $data = str_replace("\t", "|", $row); 
    // write formatted row to output file 
    fwrite($fp, $data); 
} 
fclose($fp); 
?> 
+0

谢谢你们所有人的好意。但我仍然不能从制表符分隔到管道分隔符。因为我是批量和编码的成员。我还在等你的帮助。 T_T – user1446972

1

假设你的意思是批处理,就像在Windows中一样,最简单的方法是前往GnuWin32 packages page并获取sed的副本。

然后,你可以简单地像更换管道符号标签:

sed "s/\t/|/g" inputfile >outputfile 

或者,如果你不介意让你的手脏一点C语言的表达:

#include <stdio.h> 
int main (void) { 
    int ch; 
    while ((ch = fgetc (stdin)) != EOF) 
     putchar ((ch == '\t') ? '|' : ch); 
    return 0; 
} 

编译该程序tab2pipe.c纳入可执行文件tab2pipe将允许您将其运行为:

tab2pipe <inputfile >outputfile 
2
setlocal enabledelayedexpansion 
del Customer_Pipe.csv 
for /f "delims=" %%i in (Customer_Tab.pwf) do (
    set line=%%i 
    >> Customer_Pipe.csv echo !line: =^|! 
) 

还有在最后一行

+0

我试图运行这个批处理,但输出数据不会从制表符分隔到管道分隔。我该怎么办。因为我是业余的批量和编程。 T-T – user1446972

+0

您应该仔细阅读代码 –

+0

下面写的是什么!线后有一个制表符:在最后一行 ??在!行之后使用 : - >我在批处理文件中使用制表符,但结果与初始文件相同。它们不是从标签到管道的变化。 请指教。 – user1446972

3

!line:后一个制表字符修改文本文件的一个糟糕的选择。获得可靠的解决方案过于复杂,而且速度缓慢。但这是可以完成的。

@echo off 
setlocal disableDelayedExpansion 

set input="Customer_Tab.pwf" 
set output="Customer_Pipe.csv" 

::There should be a TAB character after the equal below 
set "tab= " 

>%output% (
    for /f "delims=" %%A in ('findstr /rn "^" %input%') do (
    set ln=%%A 
    setlocal enableDelayedExpansion 
    set "ln=!ln:*:=!" 
    if defined ln set "ln=!ln:%tab%=|!" 
    echo(!ln! 
    endlocal 
) 
) 

该解决方案将同时读取的Unix(<LF>)和Windows风格(<CR><LF>)线。输出将是Windows样式行。

以上的唯一限制是每行必须是<〜8k的长度。

tab变量没有必要。我用它来使代码更加明显。

相关问题