這個例子估計應用面比較窄。我需要批量獲取某個文件夾下所有視頻的基本信息,并按一定規則對這些基本信息進行計算、排列組合。
我需要批量獲取類似上圖中的mp4文件的文件名(不要后綴)、編碼(AVC/AAC)、碼率(數字)、時長(分鐘|秒顯示方式)、文件體積(數字),將其填寫到Excel中。
課程不歸我管,是一個小姑娘在管,每次她都是手動一個一個點開這些視頻,從詳細信息中獲取這幾個字段的值,手工一個一個復制粘貼。后來她領導想了個聰明辦法:凡是要提交課程的部門,自己把課程基本信息填寫好。于是體力活兒轉嫁到我們這些業務部門來了。作為懶人,我可不想這么干。
這個案例中,最難的是怎么批量提取視頻文件的基本信息。我之前爬網,沒找到直接用windows資源管理器搞定我需要的字段信息的辦法,雖然我能在詳細信息里看到。
后來找到了Mediainfo這個軟件。
下載安裝后,打開:
在上面的紅框處點擊,定位包含視頻的文件夾,然后選中,加載到Mediainfo中來。
然后在下面的紅框處點擊,進入導出meta信息的界面:
選擇csv,保持默認,注意最后大紅框處選擇輸出文件的路徑。我輸出到桌面。
有了這個文件之后,剩下的就很簡單了,在PowerQuery中,導入csv文件。操作也沒有什么特別之處:
let
源 = Csv.Document(File.Contents("C:\Users\wanght\Desktop\test.csv"),[Delimiter=",", Columns=3, QuoteStyle=QuoteStyle.None]),
按分隔符拆分列 = Table.SplitColumn(源, "Column1", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv)),
刪除的其他列 = Table.SelectColumns(按分隔符拆分列,{"Column1.5", "Column1.19", "Column1.20", "Column1.24", "Column1.27"}),
提升的標題 = Table.PromoteHeaders(刪除的其他列, [PromoteAllScalars=true]),
篩選的行 = Table.SelectRows(提升的標題, each ([#"General Duration/String"] <> null and [#"General Duration/String"] <> "" and [#"General Duration/String"] <> "1" and [#"General Duration/String"] <> "Chinese (China)")),
刪除的副本 = Table.Distinct(篩選的行),
按分隔符拆分列1 = Table.SplitColumn(刪除的副本, "General Duration/String", Splitter.SplitTextByDelimiter("min", QuoteStyle.Csv), {"General Duration/String.1", "General Duration/String.2"}),
更改的類型2 = Table.TransformColumnTypes(按分隔符拆分列1,{{"General Duration/String.1", Int64.Type}, {"General Duration/String.2", type text}}),
替換的值 = Table.ReplaceValue(更改的類型2,"s","",Replacer.ReplaceText,{"General Duration/String.2"}),
重命名的列 = Table.RenameColumns(替換的值,{{"General Duration/String.1", "Minutes"}, {"General Duration/String.2", "Seconds"}}),
替換的值1 = Table.ReplaceValue(重命名的列,"MiB","",Replacer.ReplaceText,{"General FileSize/String"}),
更改的類型3 = Table.TransformColumnTypes(替換的值1,{{"General FileSize/String", type number}, {"Minutes", Int64.Type}, {"Seconds", Int64.Type}}),
自定義1 = Table.TransformColumns(更改的類型3,{"General CompleteName", each Text.BetweenDelimiters(_,"\",".",{0, RelativePosition.FromEnd},0)}),
刪除的列 = Table.RemoveColumns(自定義1,{"General OverallBitRate_Maximum/String"}),
重命名的列1 = Table.RenameColumns(刪除的列,{"General CompleteName", "課件名稱"}),
分組的行 = Table.Group(重命名的列1, {"課件名稱"},{{"課件名稱1",each Text.Combine(_[課件名稱],"|")},{"大小", each List.Sum([#"General FileSize/String"]), type number}, {"分鐘", each List.Sum([Minutes]), type number}, {"秒", each List.Sum([Seconds]), type number}}),
重命名的列2 = Table.RenameColumns(分組的行,{{"大小", "文件大?。ㄕ祝?}})
in
重命名的列2
值得注意的是,Mediainfo導出來的視頻文件meta信息中,有無數個分號(不知道這些分號是怎么回事,也沒有仔細追究過,留待將來去弄清吧),這導致在PowerQuery中分列時,如果按默認設置,會分出無數個列來。所以我把按分隔符拆分列的那一行中的列參數直接干掉了,變成了:
按分隔符拆分列 = Table.SplitColumn(源, "Column1", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv)),
另外一個值得一提的是,當我從文件路徑中分離出課件名字時,用了Text.BetweenDelimiters()函數。很好很強大。在知道這個函數之前,我都是老老實實按“\”分隔符分列,然后刪除不必要的行,再替換掉最末尾的“.mp4”。有了這個函數,一步就搞定了。算的上比較優雅的方式了。
這兩天在折騰windows下的神器Total Commander,找到了用它來批量獲取媒體文件信息的方法。首先還是要安裝Mediainfo插件,安裝好之后到TC設置列的篩選條件:
定位到視頻文件所在的文件夾,在TC左側窗口列表標題欄(上圖紅色箭頭)任意位置右鍵,彈出如圖的窗口,勾選“Configure this custom columns view...
在彈出窗口中選擇”Add column"。新增一列之后,點擊該列右邊的“+”號,為其設置具體的內容:
在彈出窗口中選擇“mediainfo”,然后在右側勾選想要添加的視頻屬性。每次只能添加一個。需添加其他視頻屬性,用同樣的辦法新增列即可。
當所有需要的列都設置完畢?;氐絋C窗口。全選所有視頻文件,然后在菜單欄中找到“Mark"菜單,選擇“Copy To Clipboard With All Details"。
將文件屬性復制到剪貼板后,打開一個文本文件,粘貼,保存文本文件。接下來就是用PowerQuery來處理了。
TC大法的好處是避免無數分號導致的默認分列會產生無數垃圾列和垃圾信息,除非像前文那樣手動修改代碼去除垃圾列,研究Mediainfo軟件導出信息詳情,剔除不需要的列以避免垃圾信息。
壞處是復制粘貼出來的沒有列標題,需要自己手動添加。這在PowerQuery中也不是什么難事兒。