2015-10-04 47 views
3

所以我在AppleScript中创建一个脚本,需要写入CSV中的一列。我已经阅读了CSV文件,并且有关于如何写入CSV的代码,但完全没有写入。我想写在第22列。目前,我可以从该列读取,但我不知道如何编辑列。或者有没有办法编辑像A3这样的excel中的某个框来表示这个“是”。我在下面附上我的代码。在苹果上写上一个CSV列

set theFile to (choose file) 
set f to read theFile 

-- break the file into paragraphs (c.f. rows) 
repeat with row in (paragraphs of f) 
    -- parse the row into comma-delimited fields 
    set fields to parseCSV(row as text) 
    -- now you have your data: 
    set verifyAccountStatus to item 22 of fields 
    set theResult to writeTo(verifyAccountStatus, "Yes", text, true) 

end repeat 

on parseCSV(theText) 
    set {od, my text item delimiters} to {my text item delimiters, ","} 
    set parsedText to text items of theText 
    set my text item delimiters to od 
    return parsedText 
end parseCSV 

on writeTo(targetFile, theData, dataType, apendData) 
    -- targetFile is the path to the file you want to write 
    -- theData is the data you want in the file. 
    -- dataType is the data type of theData and it can be text, list, record etc. 
    -- apendData is true to append theData to the end of the current contents of the file or false to overwrite it 
    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 

编辑: 出于某种原因,当我运行这个它不工作。

set theFile to (choose file) 
set openFile to open for access theFile with write permission 
do shell script "awk -F, '$1 ~ /Line 7/{$22=\"hello\"} 1' openFile" 
close access openFile 

它说,它无法打开文件中openFile

回答

2

也许考虑做使用awk这里面是内置于OS X反正。假设你的文件名为file.csv,它是用逗号分隔的,看起来像这样:

Line 0,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,16 
Line 1,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,44 
Line 2,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,93 
Line 3,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,96 
Line 4,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,19 
Line 5,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,77 
Line 6,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,30 
Line 7,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,30 
Line 8,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,1 
Line 9,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,96 

如果您运行在终端这个awk脚本,它会改变所有的field22项为“Hello”

awk -F, '{$22="hello"}1' OFS=, file.csv 

,并给你:

Line 0,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,16 
Line 1,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,44 
Line 2,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,93 
Line 3,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,96 
Line 4,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,19 
Line 5,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,77 
Line 6,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,30 
Line 7,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,30 
Line 8,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,1 
Line 9,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,hello,f23,f24,96 

如果你想在一个新的文件,只是重定向这样的输出:

awk -F, '{$22="hello"}1' OFS=, file.csv > newfile.csv 

可以使用从AppleScript的称之为:

do shell script "awk -F, '{$22=\"hello\"} 1' file.csv > newFile.csv" 

如果你希望用户选择从对话框窗口中的文件,那么你的文件名会在一个AppleScript变量 - 在你的榜样它被称为theFile。然后,您需要将其转换为文件名的外壳和awk理解,并引用它,并把它传递给shell是这样的:

do shell script "awk -F, '{$22=\"hello\"} 1' & quoted form of POSIX path of theFile & " > /tmp/a" 

如果你只是想改变包含行场22“ 77" 关于他们的任何地方,这样做:

awk -F, '/77/ {$22="hello"} 1' file.csv 

Line 0,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,16 
Line 1,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,44 
Line 2,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,93 
Line 3,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,96 
Line 4,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,19 
Line 5 field2 field3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 hello f23 f24 77 
Line 6,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,30 
Line 7,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,30 
Line 8,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,1 
Line 9,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,96 

如果你只是想改变field22上线,其中1场比赛 “7号线”,你可以这样做:

awk -F, '$1 ~ /Line 7/ {$22="hello"} 1' file.csv 
Line 0,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,16 
Line 1,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,44 
Line 2,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,93 
Line 3,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,96 
Line 4,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,19 
Line 5,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,77 
Line 6,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,30 
Line 7 field2 field3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 hello f23 f24 30 
Line 8,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,1 
Line 9,field2,field3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,96 

注:

-F,只是告诉awk是输入字段之间用逗号分隔。 OFS=,告诉awk用逗号分隔输出字段。

+0

感谢您的回答!我可以试试,但是你知道是否可以只编辑该列中的一个值? – Will

+0

应该是。我们如何知道哪一个? –

+0

我已经添加了一些提示,以帮助您在编辑中更加精确:-) –