【发布时间】:2014-03-21 01:40:08
【问题描述】:
我有一个 CSV 文件 (songs.csv),其中按歌曲在电台播放的顺序列出歌曲。歌曲在每次播放时都会列出,因此每天都会有一些重复。
我想做的是把它分成几天,找到前一天以来播放的新歌。
例如,周一、周二播放的歌曲将播放大部分相同的歌曲,但有些歌曲是周一未播放的新歌曲。
我可以使用 PowerShell 来执行此操作吗?
【问题讨论】:
标签: excel powershell csv
我有一个 CSV 文件 (songs.csv),其中按歌曲在电台播放的顺序列出歌曲。歌曲在每次播放时都会列出,因此每天都会有一些重复。
我想做的是把它分成几天,找到前一天以来播放的新歌。
例如,周一、周二播放的歌曲将播放大部分相同的歌曲,但有些歌曲是周一未播放的新歌曲。
我可以使用 PowerShell 来执行此操作吗?
【问题讨论】:
标签: excel powershell csv
这在 Excel 中相当简单。
首先,您需要确保您的日子在它自己的专栏中。
例如:
A1 B1 C1 D1 E1 F1 G1 H1
Date Time Artist Song Date Time Artist Song
21/03/2014 11:26 Pharrell Happy 20/03/2014 23:54 Clean Bandit Rather Be
现在在 I1,有这个公式
=VLOOKUP(H1,D1:D94,1,FALSE)
您的 H 列中的任何 #N/A 都将是当天播放的新歌!
对于更多天,您可以从下一列 (J) 开始播放第二天的歌曲,然后使用第 2 天和第 3 天之间的公式。
【讨论】:
我认为这样做可以,但需要注意的是:
Date, Time, Artist, Song
,,,的数千个空行
此脚本将导入修改后的 CSV,按天对歌曲进行分组,然后显示当天播放但前一天未播放的歌曲。
注意。如果在星期一播放一首歌,它将显示为一首新歌。如果周二没有播放,则在周三播放,它将从周二开始再次显示为一首新歌。
注意。因为你提到了按顺序播放的歌曲,如果“Demon”作为新歌播放,然后在同一天晚些时候再次播放,它会再次显示为新歌。输出是按顺序播放的,而不是按字母顺序,没有尝试删除重复项。
注意。输入中存在错误 - 间距/拼写错误,将艺术家姓名放在歌曲标题列中,此脚本获取错误并在输出中产生错误。这不是魔法(tm)。
$songs = Import-Csv .\songs.csv
$songsByDay = ($songs | Group-Object "Date" | Sort-Object -Property "Name")
$previousDay = @()
foreach ($day in $songsByDay) {
write "----"
write $day.Name
$daySongTitles = @($day.Group | %{ $_.Song })
foreach ($songTitle in $daySongTitles) {
if ($songTitle -notin $previousDay) {
write $songTitle
}
}
$previousDay = $($daySongTitles | Sort-Object)
}
编辑
更改脚本以跟踪每天的歌曲,并在此处打印艺术家姓名:
$songs = Import-Csv .\songs.csv
$songsByDay = ($songs | Group-Object "Date" | Sort-Object -Property "Name")
$previousDay = @()
foreach ($day in $songsByDay) {
write "----"
write $day.Name
foreach ($song in @($day.Group)) {
if ($song.Song -notin $previousDay) {
write "$($song.Artist) - $($song.Song)"
}
}
$previousDay += @($day.Group | %{ $_.Song })
}
【讨论】:
ConvertTo-HTML,要么更有可能自己将 HTML 片段写入文件,例如让它更像write "<tr><td>$song.Artist</td>..." >> output.html