从文件中查找文本并将其设置为applescript中的变量?

时间:2014-03-01 07:11:27

标签: applescript

我正在尝试构建一个脚本,向我发送来自cex.io的更新和通知。请继续阅读下面的内容,因此我可能会指导您,直到我遇到麻烦为止。

此操作中的第一个简单脚本将转至cex.io的BTC / GHS交易页面。它记录并每4秒将文本保存到文件中。它很棒。它不需要进行safari刷新,因为该站点会将信息实时推送到浏览器。

repeat
set the webpage_content to ""
tell application "Safari" to set the webpage_content to the text of document 1
set theText to webpage_content
set a to "Macintosh HD:Users:PRIVATE:Desktop:CEX:"
set theFile to (open for access file ((a) & "CEXRaw") with write permission)
write theText to theFile
close access theFile
delay 4
end repeat

-

它每4秒在主文件中返回一次:(注意我从文件的底部和顶部切下一块,因为它们不重要)

GHS:
0.05233439
BTC:
0.00000223
NMC:
0.00002939
LTC:
0.00000000
GHS/BTC
0.02362958 LTC/BTC
0.02438131 NMC/BTC
0.00597565 GHS/NMC
3.96951800 BF1/BTC
1.67000000 Fund Account
GHS/BTC
Last price:
0.02362958
Daily change:
-0.00018042
Today's open:
0.02381000
24h volume:
73812.35539255

-

我现在需要一个AppleScript来读取该文件,并返回所需的值。但我迷失了如何写它。

需要在BTC下找到数字,并将其设置为变量。 它需要在GHS下找到数字,并将其设置为变量。 它需要在Last Price下找到该数字,并将其设置为变量。

如果有人能为我快速编写脚本,或者告诉我该怎么做,那就太棒了。非常感谢你!

2 个答案:

答案 0 :(得分:0)

好吧,如果这些值总是在同一个段落中,你可以按行号拉它们。

set theCEXRaw to read file "Macintosh HD:Users:PRIVATE:Desktop:CEX:CEXRaw"
set theGHS to paragraph 2 of theCEXRaw
set theBTC to paragraph 4 of theCEXRaw
set thePRICE to paragraph 17 of theCEXRaw

您需要调整段落编号。但是,假设段落编号不一致,在纯Applescript中,您将使用Applescript的Text Item Delimiters。

set theCEXRaw to read file "Macintosh HD:Users:PRIVATE:Desktop:CEX:CEXRaw"
set AppleScript's text item delimiters to {("GHS:
"), ("BTC:
"), ("Last price:
")}
set theCEXRaw to text items of theCEXRaw

set theGHS to paragraph 1 of item 2 of theCEXRaw
set theBTC to paragraph 1 of item 3 of theCEXRaw
set thePRICE to paragraph 1 of item 4 of theCEXRaw

请注意,三个delim包含引号内的返回字符。您将首先捕获旧分隔符,以便可以恢复它,并希望您可以在重复循环之外设置分隔符以节省果汁。 您还可以使用带有sed或grep的do shell脚本来去除每个值。

答案 1 :(得分:0)

您可以使用the offset获取这些值,该字符串在字符串中搜索子字符串并返回其字符位置。

例如,set pos to the offset of "world" in "hello world" -- returns 7

以下是使用此主体查找值并将其转换为Applescript浮点类型Number

的解决方案
property line_delimiter : linefeed -- OR return OR return & linefeed pending your data

set results to "GHS:
0.05233439
BTC:
0.00000223
NMC:
0.00002939
LTC:
0.00000000
Last price:
0.02362958"

processCEX(results)

on processCEX(in_text)      
    set btc_val to searchNumberValueLine("BTC:" & line_delimiter, in_text)
    set ghs_val to searchNumberValueLine("GHS:" & line_delimiter, in_text)
    set last_price_val to searchNumberValueLine("Last price:" & line_delimiter, in_text)

    display dialog ("btc = " & btc_val & return & "ghs = " & ghs_val & return & " last price = " & last_price_val)
end processCEX

on searchNumberValueLine(key_name, input_str)

    set start_index to the offset of key_name in input_str

    if (start_index is not 0) then
        set input_str to text (start_index + ((length of key_name))) thru -1 of input_str
        set end_index to the offset of line_delimiter in input_str

        if (end_index is 0) then
            return input_str as number
        else
            return (text 1 thru (end_index - 1) of input_str) as number
        end if          
    else
        return -1
    end if
end searchNumberValueLine

另外,如果您不需要,我建议不要写入文本文件,以避免在从其他脚本读取同一文件时出现任何文件问题,因为您每4秒钟修改一次。

您可以将代码更改为以下内容:

repeat
  set the webpage_content to ""
  tell application "Safari" to set the webpage_content to the text of document 1
  processCEX(webpage_content)
  delay 4
end repeat