提取 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 中的多个曲目添加到播放列表中