File 用于解析名称和创建文件的Apple脚本
我是一名医生,正在尝试以以下格式解析从Filemaker Pro创建的文件:CCDOC | FamID | PtID | DocType | Date | FileExtension 在哪里File 用于解析名称和创建文件的Apple脚本,file,applescript,osx-yosemite,create-directory,File,Applescript,Osx Yosemite,Create Directory,我是一名医生,正在尝试以以下格式解析从Filemaker Pro创建的文件:CCDOC | FamID | PtID | DocType | Date | FileExtension 在哪里 CCDOC是识别临床护理文件的前缀 FamID是家庭ID PtID是患者ID 文件类型(放射学、实验室、咨询等) 日期(格式为mm\U dd\U yyy) 扩展(主要是PDF,但也有一些JPG等) 我想制作一个苹果脚本,根据这些类型创建嵌套文件夹(家庭文件夹包含该家庭中的患者文件夹,其中包含不同的文档类
- CCDOC是识别临床护理文件的前缀
- FamID是家庭ID
- PtID是患者ID
- 文件类型(放射学、实验室、咨询等)
- 日期(格式为mm\U dd\U yyy)
- 扩展(主要是PDF,但也有一些JPG等)
只需输入根文件夹的路径,即您希望文件夹所在的位置。祝你好运
set rootFolder to path to desktop
set tempVar to display dialog "Enter the following information separated by \"/\"" & return & "CCDOC/FamID/PtID/DocType/Date/FileExtension" default answer ""
set folderPath to text returned of tempVar
set thePath to POSIX path of rootFolder & folderPath
do shell script "mkdir -p " & quoted form of thePath
更新的答案 根据我到目前为止收集到的信息,这是目前我能为您提供的最新信息。它的评论非常好,所以你可以看到它在做什么。加上一个例子,我可能会让你更进一步
#!/bin/bash
#
# Go to the Desktop, or wherever the CSV file is and the output tree must be made
cd ~/Desktop || exit
# Parse "data.csv" using "|" as field separator
awk -F'|' '
{
# Pick up all fields of record into appropriately named variables
CCDOC=$1; FamID=$2; PtID=$3; DocType=$4; Date=$5; Ext=$6;
# Output name of directory to create, surrounded by "" to permit spaces, e.g. "Lab Test"
print "\"ROOT/" FamID "/" PtID "/" DocType "/" Date "\""
}' data.csv | xargs mkdir -p
给定一个data.csv
文件,如下所示:
CCDOC|F999|P5678|Consult|02-03-2013|PDF
CCDOC|F7777|P1111|Radiology|03-04-1999|JPG
CCDOC|F999|P4321|Lab Test|06-12-1997|PDF
您将获得以下信息:
原始答案
本质上,您的问题的答案是在shell中使用mkdir-p
命令生成一个目录,包括任何必要的中间目录,而不必抱怨任何已经存在或不存在的目录。你自己试试吧,把这个贴到终端上
mkdir -p ~/Desktop/Freddy/Frog/on/a/log
你会在桌面上看到这个
现在,问题是是否使用Applescript解析Filemaker Pro CSV文件。就我个人而言,我觉得Applescript太过冗长,令人难以置信,以至于难以理解,我会在一周中的每一天都使用straightbash
。。。别忘了,只需使用
do shell script xyz
举个小例子,假设您将以下内容保存为桌面上的示例文件,并将其命名为data.csv
。注:F999家族中有两名患者(P5678
和P4321
)
CCDOC|F999|P5678|Consult|02-03-2013|PDF
CCDOC|F7777|P1111|Radiology|03-04-1999|JPG
CCDOC|F999|P4321|Lab|06-12-1997|PDF
然后,您可以将以下一行粘贴到终端中
cd ~/Desktop && awk -F'|' '{print "ROOT/" $2 "/" $3}' data.csv | xargs mkdir -p
最后你会做以下的事情
让我解释一下脚本是如何工作的。首先,它将目录更改为您的桌面(cd~/Desktop
),然后,如果工作正常(&&
),它将启动awk
,并告诉它每行上的字段都由竖条隔开(awk-F'|'
)。然后awk将读取data.csv
中的所有行,并拆分字段并为它们编号-因此$1
将包含CCDOC
,$2
将包含家庭ID
,$3
将包含PatientId
。因此,对于CSV文件中的每一行,我们都打印ROOT/FamilyId/PatientId
。实际上,awk
脚本的输出如下:
ROOT/F999/P5678
ROOT/F7777/P1111
ROOT/F999/P4321
但是,我们将这些行传递到xargs
中,并告诉它在每一行上运行mkdir-p
,因此它可以有效地执行此操作,这使得我在上面截取的文件夹
mkdir -p ROOT/F999/P5678
mkdir -p ROOT/F7777/P1111
mkdir -p ROOT/F999/P4321
如果您不想从终端执行此操作,而是想从Applescript执行此操作,则只需将相同的命令放入文件并调用它,例如MarksThing
#!/bin/bash
cd ~/Desktop && awk -F'|' '{print "ROOT/" $2 "/" $3}' data.csv | xargs mkdir -p
然后在Applescript中,您可以
do shell script "MarksThing"
尽管您必须首先使用
chmod +x MarksThing
我知道这并不能完全回答你的问题,但我仍然不理解其余的问题。与其猜测和浪费大量时间,不如回答我的问题(在原始问题下方的
注释中),并告诉我您是否有兴趣继续此“非Applescript”在我做得太多之前,请先接近我。我建议您查看FileMaker的AppleScript字典,尝试编写一个AppleScript,告诉FileMaker和Finder创建所需的文件和文件夹,而不是从FileMaker导出CSV,然后对其进行解析并从中创建文件。您可能会创建一个更简单、更易于编写和维护的脚本
如果您没有FileMaker的访问权限,您可能需要编写一个AppleScript,告诉Number和Finder创建文件和文件夹。数字可以为您读取CSV,Finder可以创建文件夹并移动文件。执行此操作的命令位于数字AppleScript字典和Finder AppleScript字典中,它们非常容易学习
例如,要使用Finder在桌面上创建根文件夹:
tell application "Finder"
set theDesktopFolder to the path to the desktop folder as alias
set theRootFolderName to "Patient Care"
set theRootFolder to make new folder at theDesktopFolder with properties {name:theRootFolderName}
end tell
…然后,您可以告诉Number打开CSV并逐列、逐单元格循环,获取单元格值,并告诉Finder在RootFolder对象中创建相应的文件夹,该对象由上述脚本存储为变量,因此您只需说:
make new folder at theRootFolder with properties {name:theCellValue}
上面的脚本是故意用冗长的方式编写的,这样更容易阅读和理解。完成脚本后,您可以与其他人共享脚本,例如,他们可能必须将“患者护理”名称更改为“客户护理”或类似名称,这对于他们来说很容易在明确编写的AppleScript中完成,即使他们没有AppleScript技能。这是AppleScript的一个主要特性
您可以在中找到如何在AppleScript中执行重复循环。它还将向您展示如何打开要使用的应用程序的AppleScript字典,如数字和查找器
还请注意,shell脚本可能很危险。您可以用AppleScript无法实现的方式擦除数据。如果你搞砸了AppleScript,你会得到一个错误。如果你把bash搞砸了,你可以清除千兆字节的数据。很多关于堆栈溢出的人会回答你的AppleScript问题