【问题标题】:Take data from a CSV file, then compare based on the different days listed从 CSV 文件中获取数据,然后根据列出的不同日期进行比较
【发布时间】:2014-03-21 01:40:08
【问题描述】:

我有一个 CSV 文件 (songs.csv),其中按歌曲在电台播放的顺序列出歌曲。歌曲在每次播放时都会列出,因此每天都会有一些重复。

我想做的是把它分成几天,找到前一天以来播放的新歌。

例如,周一、周二播放的歌曲将播放大部分相同的歌曲,但有些歌曲是周一未播放的新歌曲。

我可以使用 PowerShell 来执行此操作吗?

【问题讨论】:

    标签: excel powershell csv


    【解决方案1】:

    这在 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 天之间的公式。

    【讨论】:

      【解决方案2】:

      我认为这样做可以,但需要注意的是:

      1. 编辑 CSV 文件并为列名添加顶行,例如Date, Time, Artist, Song
      2. 删除文件末尾仅有,,,的数千个空行

      此脚本将导入修改后的 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 })
      }
      

      【讨论】:

      • 这太棒了,谢谢,看起来它会很好用。无论如何要修改脚本一点点。除了只检查前一天,我们可以让它检查所有前一天吗?另外,我可以输出艺术家和歌曲名称吗?例如所以输出会像 (Artist - Title) 而不仅仅是标题。
      • @user3444441 使用更新版本编辑了我的答案。
      • 再修改一下,怎么能把这个输出到HTML文件?
      • @user3444441 不确定;它要么需要完全不同的重建来使用ConvertTo-HTML,要么更有可能自己将 HTML 片段写入文件,例如让它更像write "<tr><td>$song.Artist</td>..." >> output.html
      • 我一直在努力解决,你在哪里声明变量$previousDay,还是这是一个全局变量?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2016-04-12
      • 2015-12-15
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多