2

2 つのファイルを 1 つのファイルにマージするときに問題が発生します。最初のファイルには行 1 2 3 4 が含まれ、2 番目のファイルには行 5 6 7 が含まれます。

これを行うcopy test1.txt+test2.txt result.txtと、次の行が表示されます。4 が 5 に近いことを確認してください。

1
2
3
45
6
7

理由はわかりませんが、次のような新しい行から 5 6 7 が続くことを期待しています。

1
2
3
4
5
6
7

これはテストケースです。これをより大きなファイルに拡張したい。「タイプ」も試してみましたが、同じ結果でした。

誰かアドバイスしてくれませんか?ありがとう

4

1 に答える 1

3

Mofi のコメントにあるように、test1.txt の最後の行が改行で終わっていません。COPY も TYPE もファイルの末尾に改行を追加しないため、test1 の末尾が test2 の先頭に達します。

あなたのコメントでは、次を使用して問題を解決したと述べています。

for %%x in (test*.txt) do more "%%x" >>new.txt

以下を使用すると、もう少し効率的にすることができます。

(for %%x in (test*.txt) do more "%%x") >new.txt

どちらの方法でも、コンテンツにタブ文字が含まれておらず、ソース ファイルが 32k 行を超えない限り、上記は正常に機能します。

タブ文字は、MORE によって一連の空白文字に変換されます。

また、出力がリダイレクトされた MORE は、32k 行に達すると一時停止し、入力を待ちます。

上記のいずれかが問題である場合は、次のようなことができます。

(
  for %%x in (test*.txt) do (
    type "%%x"
    echo(
  )
) >new.txt

これにより、各ファイル間に常に改行が挿入されます。ただし、ファイルの最後の行に既に改行が含まれている場合、これは問題になる可能性があります。そのような場合、あなたはで終わるでしょう

1
2
3
4

5
6
7

完全な解決策は、ファイルの最後の行が改行で終わっていないことを検出することです。

以下は、すべてのファイルが Windows スタイルの改行 (キャリッジ リターン/ライン フィード) を使用していることがわかっている場合に機能します。FINDSTR は、キャリッジ リターンを含まない行を識別します。

(
  for %%x in (test*.txt) do (
    type "%%x"
    findstr /v $ "%%x" >nul && echo(
  )
) >new.txt

一部のファイルが代わりに 'nix スタイル (改行のみ) を使用している場合、解決策はもう少し複雑になります。この FINDSTR は、改行を含まない行を識別します。

setlocal enableDelayedExpansion
:: define LF to contain a line feed character (0x0A)
set ^"LF=

^" The empty line above is critical - DO NOT REMOVE
(
  for %%x in (test*.txt) do (
    type "%%x"
    findstr /v "!lf!." >nul && echo(
  )
) >new.txt
于 2014-07-25T21:48:58.483 に答える