提取 CSV 文件中的随机曲目列表

Posted

技术标签:

【中文标题】提取 CSV 文件中的随机曲目列表【英文标题】:Extract a random list of tracks in a CSV file 【发布时间】: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!... 【参考方案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

【讨论】:

以上是关于提取 CSV 文件中的随机曲目列表的主要内容,如果未能解决你的问题,请参考以下文章

AppleScript 使用文本文件作为源将 iTunes 中的多个曲目添加到播放列表中

将一列csv提取成逗号分隔的列表python

在 PySpotify 中,试图在不知道曲目在播放列表中的位置的情况下从播放列表中删除曲目

从 R 中的大型 .CSV 导入和提取随机样本

从 Jmeter 中的 CSV 文件中随机选择

从R中的大型.CSV导入和提取随机样本