0

テキスト ファイルを固定長ファイルに変換する方法:

これが私のコード試行とサンプル テキスト ファイルです。

del answer.txt

@ECHO on
@setlocal ENABLEDELAYEDEXPANSION
cls
set space=  
set var

:: loop through records
for /f "tokens=1-6 skip=1 delims=," %%a in (comma3.txt) do (
echo tokens %%a %%b %%c %%d %%e %%f
set var=%%a%space%%%b%space%%%c%space%%%d%%e%%f
echo var %var%
echo %var% >> answer.txt
)
endlocal
pause

入力:

1116559,P1303251287,20130325225906CD,13013822,1,0000
1104220,P1303250282,20130325070119CD,,1,0000
1064743,P1303251094,20130325191600CD,,0,0000
1100819,P1303250369,20130325091722CD,,0,0000
1101405,P1303250051,20130325010740CD,,0,0000

望ましい出力:

1116559   P1303251287   20130325225906CD   13013822   1   0000
1104220   P1303250282   20130325070119CD              1   0000
1064743   P1303251094   20130325191600CD              0   0000
1100819   P1303250369   20130325091722CD              0   0000
1101405   P1303250051   20130325010740CD              2   0000

ノート:

コマンドはset var変数を保存しません。

大変助かりました!

4

4 に答える 4

1

これは、すべての問題を解決するためのワンライナーです。:)

>answer.txt powershell "Get-Content comma3.txt | %{'{0,-10}{1,-14}{2,-19}{3,-11}{4,-4}{5}' -f $_.split(',')}"

これをバッチ スクリプトに入れる場合は、必ずその行%を withに置き換えてください。%%

answer.txt の内容:

1116559   P1303251287   20130325225906CD   13013822   1   0000
1104220   P1303250282   20130325070119CD              1   0000
1064743   P1303251094   20130325191600CD              0   0000
1100819   P1303250369   20130325091722CD              0   0000
1101405   P1303250051   20130325010740CD              0   0000

弱い説明:

私がその行を作成するのに多くの試行錯誤が必要だったので、powershellに慣れている人はおそらく私よりもこれをうまく説明できるでしょう. しかし、基本的に、私が理解しているように、それは次のような意味です。

  • powershell コマンドの出力をanswer.txt
  • 読んだcomma3.txt
  • %省略形ですfor each line
  • 文字列引数にprintf "%-10s %-14s %-19s etc."使用するのと同様のフォーマットされた行を返しますline.split(",")

おそらくpowershellのWrite-Contentコマンドがありますが、コマンドコンソールにpowershellの出力をリダイレクトさせるだけの方が簡単でした。非常に大きな csv ファイルを操作していて、このコマンドの動作が遅すぎる場合は、Write-Content調査する価値があるかもしれません。

于 2013-03-28T15:00:26.763 に答える
0
@ECHO on
@setlocal ENABLEDELAYEDEXPANSION
cls

:: loop through records
for /f "tokens=1-6 delims=," %%a in (comma3.txt) do (
set var=%%a %%b %%c %%d %%e %%f
REM  The double comma is a problem without a good solution
REM     so if the last token is null, drop it and indent. 
if '%%f' == '' set var=%%a %%b %%c          %%d %%e
REM  !'s should be used with ENABLEDELAYEDEXPANSION
echo !var! >> answer.txt
)
endlocal
于 2013-03-28T00:37:58.913 に答える
0
@ECHO off
SETLOCAL
set columnsizes=10 14 19 11 4 4
DEL answer.txt 2>nul

:: loop through records
for /f "delims=" %%a in (comma3.txt) do (
SET "result="
SET line=%%a
CALL :process %columnsizes%
)
ECHO.======================================
TYPE answer.txt
ECHO.======================================
PAUSE 
GOTO :eof

:process
REM IF "%1"=="" echo %result%>>answer.txt ECHO %result%&GOTO :eof
IF "%1"=="" echo %result%>>answer.txt&GOTO :eof
SET "column="
:colloop
IF NOT DEFINED line GOTO endcol
SET ch1=%line:~0,1%
SET line=%line:~1%
IF NOT "%ch1%"=="," SET column=%column%%ch1%&GOTO colloop
:endcol
SET column=%column%                           x
CALL SET result=%result%%%column:~0,%1%%
SHIFT
GOTO process

これで問題が解決するはずです。

FORループは、各行の内容を順に割り当てますline。ルーチン:processは aline を分析し、コンマが見つかるまで各列を 1 文字ずつ作成します。次に、行末に多数のスペースを追加します。「x」は次のステートメントで切り捨てられ、行の末尾のスペースを表示するのが少し難しくなります (一部の編集者はプロンプトなしでそれらを破棄します)。

CALL SET行はパーサー特性を使用します。resultが現在abcdcolumnあり、%1 が 5 であるとします。パーサー123 ..manyspaces.. xは、%var% を現在の値で置き換えて行を処理し、それを呼び出します。したがって、呼び出されるものは次のとおりです。

SET result=abcd  +%+%column:~0,5+%

もちろん、+ なしで - パーサーがコードをどのように認識しているかを示すためのものです。

そのため、不要な末尾のスペースと x in がきれいに取り除かれcolumnます。SHIFT は、提供されたパラメーター リストから最初の要素を削除し、:processすべてが完了してパラメーターがなくなるまで、次の列が処理されます。を書き出すresultと、完了です...

于 2013-03-28T05:25:20.860 に答える