【问题标题】:Extract a random list of tracks in a CSV file提取 CSV 文件中的随机曲目列表
【发布时间】:2021-01-04 13:03:51
【问题描述】:

我有一个包含数百首音乐曲目列表的 CSV 文件,我想要 随机抽取100个。 我对 bacth 脚本完全陌生。

表格的创建是正确的,但我希望能够使其随机而不是重复。

第二个 FOR (in :RANDOMIZE) 不回显任何内容

@ECHO OFF

setlocal enabledelayedexpansion

set _total=0
set _max=100

for /f "skip=1 tokens=11 usebackq delims=;" %%I in ("playlist.csv") do (
    set _filepath=%%~I
    set _ext=%%~xI

    if "!_ext!"==".flac" CALL :ADDARRAY
    if "!_ext!"==".mp3" CALL :ADDARRAY
)

:RANDOMIZE
for %%a in (%_array%) do (
    set /A _total+=1
    echo %%a
    if "!_total!"=="!max!" @goto :eof
)

:ADDARRAY
set /A _cpt+=1
set _array[!_cpt!]=!_filepath!
@goto :eof

【问题讨论】:

  • 没有名为%_array% 的变量,这就是for %%a 循环不迭代的原因。循环实际上应该是这样的:for /F "tokens=1* delims==" %%A in ('set _array[') do (,然后在循环体中使用%%B。或者,使用这个循环:for /L %%B in (1,1,%_max%) do ((也使用%%B)。此外,没有名为!max! 的变量,它是!_max!。虽然这仍然不会返回随机值……
  • 感谢 aschipfl 的回答 工作就像一个魅力 :) 你知道我如何随机化它吗?
  • 不客气,虽然这不是一个答案,而只是一个评论,因为缺少随机化的基本部分,这并不是那么微不足道,特别是当你想避免重复时。您可以尝试使用本网站的搜索功能,例如搜索词[batch-file] random without duplicates。如果您不关心重复,请在循环中尝试set /A "RND=!RANDOM!%%%_max%+1" & echo !RND!...

标签: arrays csv batch-file random cmd


【解决方案1】:

这是在 PowerShell 中执行此操作的一种方法。如果您使用的是受支持的 Windows 系统,则可以使用 PowerShell。这也很容易从 cmd.exe 运行。

$songs = Import-Csv -Path 'C:\src\t\playlist.csv'
$chosen = 0..$songs.Count | Get-Random -Count 5
foreach ($c in $chosen) { $songs[$c] }

如果只能从 cmd.exe 运行,请使用它。

@powershell -NoLogo -NoProfile -Command ^
    "$songs = Import-Csv -Path 'C:\src\t\playlist.csv';" ^
    "$chosen = 0..$songs.Count | Get-Random -Count 5;" ^
    "foreach ($c in $chosen) { $songs[$c] }"

【讨论】:

    【解决方案2】:

    感谢Aacini,我终于找到了一个很好的解决方法

    这是我的代码,它工作正常

    rem -------
    rem | UT8 |
    rem -------
    
    chcp 65001
    
    cls
    
    @ECHO OFF
    
    setlocal EnableDelayedExpansion
    
    rem ---- ENTREE UTILISATEUR POUR LE MAXIMUM DE MORCEAUX A PRENDRE (Illimité si aucune saisie) ----
    set /p "_maximum=Nombre de morceaux à récupérer : "
    
    cls
    
    rem ---- VARIABLES ----
    set _iFLAC=0
    set _iMP3=0
    set _total=0
    set _index=0
    set _cpt=0
    set ""="
    
    rem -----------------------------------------------------------------------------------------------
    rem | Alimentation de la table à partir du fichier csv : tokens=11 -> 11eme colonne du fichier csv |
    rem | uniquement s'il s'agit d'un fichier FLAC ou MP3                                              |
    rem | dans la limite du nombre maximum de morceaux saisi par l'utilisateur                         |
    rem -----------------------------------------------------------------------------------------------
    
    for /f "skip=1 tokens=11 usebackq delims=;" %%I in ("playlist.csv") do (
        set _filepath=%%~I
        set _ext=%%~xI
    
        if "!_ext!"==".flac" CALL :ADDARRAY
        if "!_ext!"==".mp3" CALL :ADDARRAY
    )
    
    rem ---- Si l'utilisateur n'a rien saisi le maximum est la nombre d'entrée total ----
    IF NOT DEFINED _maximum set _maximum=!_index!
    
    echo ---------------------------------------------------------------------------
    echo                  NOMBRE DE MORCEAUX A TRAITER : !_maximum!
    echo ---------------------------------------------------------------------------
    
    for /L %%B in (1,1,%_maximum%) do (
        call :getRandomElem i=
        set _array[!i!]=0
    )
    
    echo LISTE final
    echo -----------
    for /L %%A in (1,1,%_maximum%) do (
        echo !_final[%%A]!|find "flac" >nul
        if errorlevel 1 (CALL :MP3) else (CALL :FLAC)
        echo !_final[%%A]!
        echo/
    )
    
    :END
    echo ---------------
    echo FLAC : !_iFLAC!
    echo MP3 : !_iMP3!
    echo TOTAL : !_total!
    @goto :eof
    
    :ADDARRAY
    set _array[!_index!]=!_filepath!
    set /A _index+=1
    @goto :eof
    
    :getRandomElem i=
    set /A i = _index * %random% / 32768 + 1
    if !_array[%i%]! equ 0 goto getRandomElem
    set /A _cpt+=1
    set _final[!_cpt!]=!_array[%i%]!
    exit /B
    
    :FLAC
    echo FICHIER FLAC !_array[%%B]!
    set /A _iFLAC+=1
    set /A _total+=1
    @goto :eof
    
    :MP3
    echo FICHIER MP3 !_array[%%B]!
    set /A _iMP3+=1
    set /A _total+=1
    @goto :eof
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 2017-03-28
      相关资源
      最近更新 更多