我是一名医生,试图以下列格式解析从Filemaker Pro创建的文件:CCDOC | FamID | PtID | DocType | Date | FileExtension 其中
我想创建一个Apple脚本,它将根据这些类型创建嵌套文件夹(Family文件夹包含该系列中的患者文件夹,其中包含不同的文档类型等)。然后文件将被移动到该文件夹。
你能帮我解决这个问题吗?
这是文件格式的图像
这是创建它们的CSV文件
答案 0 :(得分:1)
更新了答案
根据我目前收集到的内容,这就是我现在可以得到的内容。它评论很好,所以你可以看到它在做什么。添加一个例子,我可能会让你更进一步......
#!/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如此令人难以置信的冗长,以至于无法理解,并且会在每周的每一天都直接bash
...而且不要忘记你可以简单地利用Applescript的所有bash
权力使用
do shell script xyz
举一个例子,假设您将以下内容保存在桌面上作为示例文件并将其命名为data.csv
。请注意,家庭P5678
中有两名患者(P4321
和F999
)。
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
将包含{{1} },FamilyId
将包含$3
。因此,对于CSV文件中的每一行,我们都会打印PatientId
。实际上,ROOT/FamilyId/PatientId
脚本的输出如下:
awk
然而,我们将这些行传递给ROOT/F999/P5678
ROOT/F7777/P1111
ROOT/F999/P4321
并告诉它在每一行上运行xargs
,因此它有效地执行此操作,这使我在上面屏幕抓取的文件夹。
mkdir -p
如果你不想从终端做到这一点,你想从Applescript中做到这一点,你只需将相同的命令放在一个文件中并调用它,比如说mkdir -p ROOT/F999/P5678
mkdir -p ROOT/F7777/P1111
mkdir -p ROOT/F999/P4321
MarksThing
然后在Applescript中,你会做
#!/bin/bash
cd ~/Desktop && awk -F'|' '{print "ROOT/" $2 "/" $3}' data.csv | xargs mkdir -p
虽然您必须先使用
使其可执行do shell script "MarksThing"
我知道这并没有完全回答你的问题,但我仍然不理解其余部分。您可以回答我的问题(在您原始问题下面的chmod +x MarksThing
),而不是猜测和浪费一大堆时间,如果您有兴趣继续阅读“非Applescript”,请告诉我在我做更多事情之前,先采取行动。
答案 1 :(得分:0)
只需输入rootFolder的路径,这是您希望文件夹所在的位置。祝你好运。
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
答案 2 :(得分:0)
我建议您查看FileMaker的AppleScript字典并尝试编写AppleScript,告诉FileMaker和Finder创建所需的文件和文件夹,而不是从FileMaker导出CSV然后解析它并从中创建文件。您可能会创建一个更简单的脚本,更容易编写和维护。
如果您无法访问FileMaker,则可能需要编写AppleScript以告知Numbers和Finder创建文件和文件夹。 Numbers可以为您读取CSV,Finder可以创建文件夹并移动文件。这样做的命令在Numbers AppleScript Dictionary和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
...然后您可以告诉Numbers打开CSV并逐列循环,逐个单元格获取单元格值,并告诉Finder在RootFolder对象中创建相应的文件夹,该对象存储为通过上面的脚本变量,所以你要说的是:
make new folder at theRootFolder with properties {name:theCellValue}
上述脚本是以故意冗长的方式编写的,使其更易于阅读和理解。当您的脚本完成后,您可以在另一个人中共享它,例如,可能必须将“患者护理”名称更改为“客户服务”或类似名称,并且他们很容易在明确编写的AppleScript中执行此操作,即使他们没有AppleScript技能。这是AppleScript的一个主要功能。
您可以在AppleScript Language Guide中找到如何在AppleScript中执行重复循环。它还将向您展示如何为您要使用的应用程序打开AppleScript Dictionaries,例如Numbers和Finder。
另请注意,shell脚本编写可能很危险。您可以使用AppleScript无法实现的方式清除数据。如果你搞砸了AppleScript,就会出错。如果你搞砸了bash,你可以消灭千兆字节的数据。 Stack Overflow上的很多人会用bash答案回答你的AppleScript问题,但如果你没有bash经验,这不一定是一个好的答案。与bash相比,AppleScript具有橡胶缓冲器,因此非程序员可以安全地创建自己的解决方案。