2015-10-04 42 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

我已經添加了一些提示,以幫助您在編輯中更加精確:-) –