Следующий код может помочь:
mapFileNames[source_, filenames_, target_] :=
Module[{depth = FileNameDepth[source]}
, FileNameJoin[{target, FileNameDrop[#, depth]}]& /@ filenames
]
htmlTreeToPlainText[source_, target_] :=
Module[{htmlFiles, textFiles, targetDirs}
, htmlFiles = FileNames["*.html", source, Infinity]
; textFiles = StringReplace[
mapFileNames[source, htmlFiles, target]
, f__~~".html"~~EndOfString :> f~~".txt"
]
; targetDirs = DeleteDuplicates[FileNameDrop[#, -1]& /@ textFiles]
; If[FileExistsQ[target], DeleteDirectory[target, DeleteContents -> True]]
; Scan[CreateDirectory[#, CreateIntermediateDirectories -> True]&, targetDirs]
; Scan[
Export[#[[2]], Import[#[[1]], "Plaintext"], "Text"] &
, Transpose[{htmlFiles, textFiles}]
]
]
Пример использования ( предупреждение : целевой каталог будет удален первым! ):
htmlTreeToPlainText["/users/me/web", "/users/me/desktop/bucket"]
Как это работает
Различные функции Mathematica FileName...
полезны в этом контексте.Сначала мы определяем вспомогательную функцию mapFileNames
, которая принимает исходный каталог, список имен файлов, которые находятся в исходном каталоге, и целевой каталог.Он возвращает список путей к файлам, которые называют соответствующие местоположения под целевым каталогом.
mapFileNames[source_, filenames_, target_] :=
Module[{depth = FileNameDepth[source]}
, FileNameJoin[{target, FileNameDrop[#, depth]}]& /@ filenames
]
Функция использует FileNameDrop
, чтобы отбрасывать ведущие элементы исходного пути из каждого имени файла, и FileNameJoin
, чтобы добавить целевую точкупуть на фронт каждого результата.Количество ведущих элементов для отбрасывания определяется путем применения FileNameDepth
к исходному пути.
Например:
In[83]:= mapFileNames["/a/b", {"/a/b/x.txt", "/a/b/c/y.txt"}, "/d"]
Out[83]= {"/d/x.txt", "/d/c/y.txt"}
Используя эту функцию, мы можем преобразовать список путей к файлам HTMLв исходном каталоге (source
) в соответствующий список путей текстовых файлов в целевом каталоге (target
):
htmlFiles = FileNames["*.html", source, Infinity]
textFiles = StringReplace[
mapFileNames[source, htmlFiles, target]
, f__~~".html"~~EndOfString :> f~~".txt"
]
Эти операторы получают список файлов HTML, сопоставляют их с целевым каталогоми затем измените расширение файла с .html
на .txt
.Теперь мы можем извлечь необходимые имена каталогов из полученных текстовых файлов:
targetDirs = DeleteDuplicates[FileNameDrop[#, -1]& /@ textFiles]
Снова используется FileNameDrop
, на этот раз для удаления части имени файла из пути каждого текстового файла.
Далеенам нужно удалить целевой каталог (если он уже существует) и создать новые требуемые каталоги:
If[FileExistsQ[target], DeleteDirectory[target, DeleteContents -> True]]
Scan[CreateDirectory[#, CreateIntermediateDirectories -> True]&, targetDirs]
Теперь мы можем выполнить преобразование HTML в текст, безопасное при условии, что целевые каталогиуже существует:
Scan[
Export[#[[2]], Import[#[[1]], "Plaintext"], "Text"] &
, Transpose[{htmlFiles, textFiles}]
]