2

我是一名医生,试图以以下格式解析从 Filemaker Pro 创建的文件:CCDOC|FamID|PtID|DocType|Date|FileExtension Where

  • CCDOC 是识别临床护理文件的前缀
  • FamID 是家庭 ID
  • PtID 是患者 ID
  • 文件类型(放射科、实验室、咨询等)
  • 日期(格式为 mm_dd_yyy)
  • 扩展名(主要是 PDF,但也有一些 JPG 等)

我想制作一个 Apple 脚本,它将基于这些类型创建嵌套文件夹(家庭文件夹包含该家庭中的患者文件夹,其中包含不同的文档类型等)。然后文件将被移动到该文件夹​​。

你能帮我解决这个问题吗?

这是文件格式的图像

在此处输入图像描述

这是创建它们的 CSV 文件

在此处输入图像描述

4

3 回答 3

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

你会得到这个:

在此处输入图像描述

原始答案

从本质上讲,您的问题的答案是mkdir -p在创建目录的 shell 中使用命令,包括任何必要的干预目录,而无需抱怨沿途是否存在任何内容。通过将其粘贴到终端中自己尝试

mkdir -p ~/Desktop/Freddy/Frog/on/a/log

你会在你的桌面上得到这个

在此处输入图像描述

现在,问题是是否使用 Applescript 解析 Filemaker Pro CSV 文件。就我个人而言,我发现 Applescript 冗长得令人难以置信,以至于难以理解,并且会bash在一周的每一天都直接使用......并且不要忘记您可以bash通过使用 Applescript 来利用 Applescript 的所有功能

do shell script xyz

举个小例子,假设您将以下内容保存为桌面上的示例文件并将其命名为data.csv. 注意家里有两个病人(P5678和) 。P4321F999

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将包含FamilyId$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

我知道这并不能完全回答你的问题,但我仍然不明白它的其余部分。与其猜测和浪费大量时间,您可以回答我的问题(在下面您的原始问题中),并在我做太多事情之前comments让我知道您是否有兴趣采用这种“非 Applescript”方法。

于 2015-03-12T09:32:19.813 回答
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}

上面的脚本是故意用冗长的方式编写的,这样更容易阅读和理解。当你的脚本完成后,你可以与另一个人分享它,例如,将“Patient Care”名称更改为“Client Care”或类似名称,这对他们来说很容易在明确编写的 AppleScript 中完成,即使他们没有 AppleScript 技能。这是 AppleScript 的一个主要特性。

您可以在AppleScript Language Guide中了解如何在 AppleScript 中重复循环。它还将向您展示如何为您想要使用的应用程序打开 AppleScript 词典,例如 Numbers 和 Finder。

另请注意,shell 脚本可能很危险。您可以使用 AppleScript 无法实现的方式清除数据。如果你搞砸了 AppleScript,你会得到一个错误。如果你搞砸了 bash,你可以清除千兆字节的数据。Stack Overflow 上的很多人都会用 bash 答案来回答您的 AppleScript 问题,但如果您没有 bash 经验,这不一定是一个好的答案。与 bash 相比,AppleScript 具有橡胶缓冲器,因此非程序员可以安全地创建自己的解决方案。

于 2015-04-02T07:23:04.293 回答
0

只需输入根文件夹的路径,这是您希望文件夹所在的位置。祝你好运。

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
于 2015-03-12T05:49:44.277 回答