如何从文件夹及其子文件夹中获取所有文件?

How to get all files from a folder and his subfolders?

想象一下这个文件路径:

  1. /root/subfolder/filename.csv
  2. /root/subfolder/subfolder2/filename2.csv

我可以从 "filename.csv" 和 "filename2.csv" 中提取数据而不显式写入它们的路径吗?

我想做类似的事情:

@var = EXTRACT column FROM "/root/{*}.csv" USING Extractors.Csv(skipFirstNRows:1);

可能吗?

是的,你可以!格式几乎与您想象的完全一样。它是通过 U-SQL 中的文件集完成的,它们允许您搜索文件夹的整个目录并从路径中提取信息。您可以在文件夹路径中的任意位置定义您选择的通配符,然后将该字符保存为提取语句中的虚拟列。

DECLARE @file_set_path string = "/Samples/Data/AmbulanceData/vehicle{vid}_{date:MM}{date:dd}{date:yyyy}.csv";

@data = 
EXTRACT vehicle_id int, 
        entry_id long, 
        event_date DateTime, 
        latitude float, 
        longitude float, 
        speed int, 
        direction string, 
        trip_id int?, 
        vid int,  // virtual file set column
        date DateTime // virtual file set column
FROM @file_set_path
USING Extractors.Csv();

注意路径 {vid} 中的常规通配符,以及它如何作为具有相同名称的新列保存在提取语句中(然后您可以使用它来过滤查询)。日期虚拟列是文件集的一项特殊功能,它允许您自动将文件集中的日期捆绑到单个 DateTime 对象中。

文件集在目录路径中的工作方式也相同 - 您可以有一组按日期和版本划分的子文件夹,并使用“/Samples/{date:yyyy}/{date:MM}/{date:dd }/{type}/RCV_{vid}.csv" 并像上面一样存储虚拟列。

如果您还有其他问题,请告诉我!

不幸的是,此功能(类似于 Kleene-* 的递归文件夹导航)在文件集中尚不可用,但在我们的长期路线图中。请 file/upvote 在 http://aka.ms/adlfeedback 上使用此功能。

目前的work-around是对你预计会遇到的每一关都有一个步骤通配符EXTRACT然后UNION ALL他们在一起。例如,

 @d1 = EXTRACT ... FROM "/fixpath/{*}" USING ... ;
 @d2 = EXTRACT ... FROM "/fixpath/{*}/{*}" USING ...;
 @d3 = EXTRACT ... FROM "/fixpath/{*}/{*}/{*}" USING ...;
 ....

 @data = 
   SELECT * FROM @d1 UNION ALL SELECT * FROM @d2 UNION ALL SELECT * FROM @d3 UNION ALL ...;