如何从目录递归读取多个文件?

时间:2019-11-18 03:57:04

标签: file-io functional-programming scheme racket

球拍/方案问题

背景:
我有1个主目录,带有12个子目录和40多个文件,扩展名:.faa

目标: -递归地读取扩展名为.faa的子目录中的所有文件 -对于等于#>的每个read-char,加1并在所有扩展名为.faa

的文件中返回#>的总数
(define scrape-directory
  (lambda (path)
    (for ([f (in-directory path)] #:when (regexp-match? "\\.faa$" f))
      < HELP HERE > ))


1 个答案:

答案 0 :(得分:1)

首先,我建议在path-has-extension?上使用regexp-match

接下来,如果要遍历的文件不大,则可以使用file->string以字符串形式获取文件的内容。从那里,您可以使用regexp-match*来获取字符串中所有#>的列表,并使用length组成的add1来获取所需的号码。 > 1

最后,您可以将所有这些文件包装为for / fold,以获取所有文件的总价值。

您得到的代码将类似于:

(define (scrape-directory path)
  (for/fold ([acc 0])
            ([f (in-directory path)] #:when (path-has-extension? f ".faa"))
    (define text (file->string f))
    (define file-total (add1 (length (regexp-match* #rx"#>" text))))
    (+ acc file-total)))

1 如果它是真正的海量文件,则也可以使用词法分析器,例如parser-tools/lex库。