从文本文件中选取特定行并一起计算它们

时间:2014-03-22 15:10:49

标签: macos applescript

这可能是一个很长的镜头,但我为自己编写了一个AppleScript,它可以记录我为任何项目工作多长时间。我想创建另一个脚本,根据日志文件中的信息计算总花费时间。

通常我的日志文件如下所示:

140304 1353 - Start
140304 1459 - End
work time :     0106
break time :    0000

140307 1248 - Start
140307 1353 - End
work time :     0105
break time :    0000

140321 1101 - Start
140321 1306 - Have a break now
140321 1342 - Back to work
140321 1423 - Have a break now - Go eat
140321 1522 - Back to work
140321 1522 - End
work time :     0246
break time :    0135

所以我需要获得每个“工作时间”值并一起计算它们。

我试过谷歌搜索,但我不知道如何开始。

2 个答案:

答案 0 :(得分:0)

Applescript的文本项目分隔符(TID)非常适合这一点。我们只需将TID设置为您想要抓取的数字之前的文本即可将文本分解为列表,在本例中为#34;工作时间"。然后我只是抓住TID之后的下一个字,因为那是数字。这很容易。您的示例的结果是457.我的脚本返回总和加上显示用于计算总和的所有值:{457,{" 0106"," 0105"," 0246"}}

set workLog to "140304 1353 - Start
140304 1459 - End
work time :     0106
break time :    0000

140307 1248 - Start
140307 1353 - End
work time :     0105
break time :    0000

140321 1101 - Start
140321 1306 - Have a break now
140321 1342 - Back to work
140321 1423 - Have a break now - Go eat
140321 1522 - Back to work
140321 1522 - End
work time :     0246
break time :    0135"

set beforeText to "work time"

set AppleScript's text item delimiters to beforeText
set textItems to text items of workLog
set AppleScript's text item delimiters to ""

set theSum to 0
set sumItems to {}
repeat with i from 2 to count of textItems
    set workTime to word 1 of (item i of textItems)
    set end of sumItems to workTime
    set theSum to theSum + (workTime as number)
end repeat

return {theSum, sumItems}

现在只需用我的代码替换代码中的第一行,它就可以在您的日志文件中使用。祝你好运。

set workLog to read (choose file)

答案 1 :(得分:0)

这是基于do shell script的替代@ regulus6633的纯AppleScript答案:

注意:我不确定您的工作时间数字如0106代表什么 - 这里我只是假设它们是十进制整数来进行求和。

set logFile to "/Users/jdoe/hours.log" # Replace with POSIX path to your log file
set total to do shell script ¬
   "awk '/^work time :/ { total+=$4 } END { print total }' " ¬
   & quoted form of logFile

shell命令使用awk,这极大地简化了解析。