问:将CSV写入可变位置

时间:2018-12-04 02:20:57

标签: csv applescript

对于AppleScript来说是非常新的事物,并且在其他地方未找到解决方案,如果我只是在其他地方没有找到答案,则表示歉意。感谢您的帮助。

背景:我正在使用AppleScript提示用户输入目录,然后使用其他提示在该目录中创建大量文件夹。提示回答后,我想创建一个CSV文件来记录这些答案,以防止重复答案,并且还允许用户终止脚本并稍后返回而不会丢失存储在列表中的项目。 CSV似乎是最简单的方法。

问题-如果将CSV定位到静态路径,则可以成功创建CSV并将其记录下来。如果从提示符处创建路径,则会收到错误消息: Finder出现错误:无法将别名“ Macintosh HD:Users:MyAccount:_Sample_Directory:”设置为常量。从别名“ Macintosh HD:Users:MyAccount:_Sample_Directory:”到常量的数字-1700

我想念什么?

仅供参考-使用this as basis for the WriteTo function.

示例脚本:

set MyList to {"A", "B", "C"}

tell application "Finder"
    --This Works, but doesn't nest in the variable folder--
    --set CSVFile to (path to desktop as text) & "List.csv" 

    --This is the goal:dynamic directory--
    set ParentFolder to (choose folder with prompt "Select Folder")

    set CSVFile to (path to ParentFolder as string & "List.csv") as POSIX file as alias
end tell

set TheResult to writeto(CSVFile, MyList, list, true)

on writeto(targetFile, theData, dataType, apendData)
    try
        set openFile to open for access file targetFile with write permission
        if apendData is false then set eof of openFile to 0
        write theData to openFile starting at eof as dataType
        close access openFile
        return true

    on error
        try
            close access file targetFile
        end try
        return false

    end try
end writeto

1 个答案:

答案 0 :(得分:-1)

在您的脚本中,您无需告诉应用程序“ Finder”。因此,您可以删除tell / end tell。

您的脚本中的错误来自以下行:

set CSVFile to (path to ParentFolder as string & "List.csv") as POSIX file as alias 

您的子例程writeto接受目标文件为字符串形式,如:

“ disk:Users:me:folder:list.csv。

因此,您的第一行可以简化为:

set CSVFile to (ParentFolder as string) & "List.csv"

是的,您可以将数据写入csv。但是我不确定这是最佳选择。当您在文件中写入列表{“ A”,“ B”,“ C”}时,您不是在写文本。因此,Applescript会执行从列表到文本的转换。在此示例中,结果为“ listutxtAutxtButxtC”。这取决于您要对该文件执行的操作,但是要使其可读,最好在文本文件中写入文本。您可以通过遍历MyList的所有项以将每个项写为文本来完成此操作:

repeat with x in MyList
    set TheResult to writeto(CSVFile, x, list, true)
end repeat

在上面的示例中,我仍然使用datatype = list而不是文本。没关系,因为该子例程不使用该参数。我想这是供将来使用。

尽管如此,它可能仍无法为您提供所需的结果。文件中的文本将为“ ABC”。为避免这种情况,建议您为在文件中写入的每个数据添加一个返回值(或制表符)。这样做,更改writeto子例程中的行:

write (theData & return) to openFile starting at eof as dataType 

那么您的cvs文件将是

A
B
C

哪个很容易阅读。