3

次のようなデータを含むテキスト ファイルがあります。

12、abcd

2541、sdfrhk

4、qwerty

13、ウイトルウ

345、イウイット

コンテンツを数値で降順に並べ替えるにはどうすればよいですか? できればバッチを使用してください。ありがとう

4

4 に答える 4

5

直接ソートすることはできません。私が考えることができる唯一のバッチソリューションは、固定幅にゼロを前に付けた番号で各行を解析して再作成することです。数値の幅が固定されたら、SORT を使用して新しい並べ替え済みファイルを作成し、次に FOR /F をもう 1 つ使用して先頭のゼロを取り除きます。

最大数は 15 桁で十分だと思います。このソリューションでは、すべての数値が 0 より大きい整数であると想定しています。

@echo off
set "file=test.txt"
>"%file%.new1" (
  for /f "usebackq tokens=1* delims=," %%A in ("%file%") do (
    set "n=000000000000000%%A"
    set "str=%%B"
    setlocal enableDelayedExpansion
    echo !n:~-15!,!str!
    endlocal
  )
)
>"%file%.new2" sort /r "%file%.new1"
>"%file%" (
  for /f "usebackq tokens=* delims=0" %%A in ("%file%.new2") do echo %%A
)
del "%file%.new?"

元のファイルの値が 0 の場合、最終ステップで追加の作業を行う必要があります。負の数が許可されている場合は、スクリプト全体でさらに多くの作業を行う必要があります。

VBScript または JavaScript を使用して、はるかに効率的なスクリプトを作成できます。

于 2012-09-09T17:51:43.527 に答える
1

もともと私はこれを投稿するつもりはありませんでした.dbenhamの答えの繰り返しのように見えたからです.サイズも同じ!(わかりました! 彼よりも 3 分の 1 長いようです、訴えてください ^_^)

@echo off
setlocal enabledelayedexpansion
set source=sortme.txt
set tsort=sortme.tmp
set size=0
set zeros=
:: Pass 1
for /f "tokens=1 delims=, " %%x in (sort.txt) do (
   set num=%%x
   call strlen num tsize
   if !tsize! gtr !size! set size=!tsize!
)
for /l %%c in (1,1,%size%) do set zeros=!zeros!0
:: Pass 2
for /f "tokens=1* delims=, " %%x in (sort.txt) do (
  set line=%zeros%%%x
  set line=!line:~-%size%!
  echo !line! %%x, %%y>> sort.tmp
)
endlocal
del sort.txt > nul
:: Pass 3
for /f "tokens=1* delims= " %%x in ('sort /r sort.tmp') do echo %%y>>sort.txt
del sort.tmp > nul

データが完了するまでに 3 回のパスが必要なため、おそらくペアリングされる可能性があります。

また、DOStips.com のSTRLEN.BAT利用しています。

于 2012-09-11T00:37:11.640 に答える