2012-05-12 2 views
4

Я хотел бы прочитать в CSV-файле в виде 2D-массива, а затем вернуть его обратно в файл CSV. Предположим, что это мой CSV-файл. Это файл excel и | подразумевает смежную ячейку:Чтение файла CSV в виде массива с помощью AppleScript

family | type 
Doctor | Pediatrics 
Engineer | Chemical 

Из того, что я понимаю, нет никаких массивов на applescript, просто списки и записи. Если было бы лучше сделать это с помощью файла XLSX, пожалуйста, дайте мне знать.

ответ

0

Если ваш вопрос только о моделировании данных CSV в AppleScript, решение использовать список записей, как это:

set csvData to {{family:"Doctor", type:"Engineer"}, {family:"Engineer", type:"Chemical"}} 

вы можете прочитать, что снова внутри repeat with aRow in csvData цикла.

Техническое примечание. Списки AppleScript реализованы в виде векторов, то есть они упорядочены и могут быть доступны с помощью числового индекса (начиная с индекса 1) - они ведут себя как массив на большинстве других языков.

4

Массив - это просто список в applescript, поэтому вы хотите получить 2d-массив или список списков в applescript-talk. Если вы понимаете разделители текстовых элементов applescript, то ваша задача - просто манипулировать преобразованием строк в списки и наоборот. Поэтому я написал вам пару обработчиков, чтобы сделать задачу легкой для вас; textToTwoDArray() и twoDArrayToText(). В этом первом примере показано, как преобразовать вашу строку в список списков с помощью textToTwoDArray().

ПРИМЕЧАНИЕ. Вы должны быть осторожны с концами строк в текстовом файле, потому что они могут быть либо возвратом каретки (символьный код 13), либо линией (символьный идентификатор 10). Вы можете видеть, что я использовал символ id 10 в своем коде, но если вы не получаете правильные результаты, попробуйте «13».

set fileText to "family | type 
Doctor | Pediatrics 
Engineer | Chemical" 

textToTwoDArray(fileText, character id 10, " | ") 

on textToTwoDArray(theText, mainDelimiter, secondaryDelimiter) 
    set {tids, text item delimiters} to {text item delimiters, mainDelimiter} 
    set firstArray to text items of theText 
    set text item delimiters to secondaryDelimiter 
    set twoDArray to {} 
    repeat with anItem in firstArray 
     set end of twoDArray to text items of anItem 
    end repeat 
    set text item delimiters to tids 
    return twoDArray 
end textToTwoDArray 

А вот как преобразовать список-оф-списков обратно в строку, используя twoDArrayToText().

set twoDArray to {{"family", "type"}, {"Doctor", "Pediatrics"}, {"Engineer", "Chemical"}} 

twoDArrayToText(twoDArray, character id 10, " | ") 

on twoDArrayToText(theArray, mainDelimiter, secondaryDelimiter) 
    set {tids, text item delimiters} to {text item delimiters, secondaryDelimiter} 
    set t to "" 
    repeat with anItem in theArray 
     set t to t & (anItem as text) & mainDelimiter 
    end repeat 
    set text item delimiters to tids 
    return (text 1 thru -2 of t) 
end twoDArrayToText 

Итак, теперь вам нужно выяснить, как читать и писать в текстовый файл с помощью applescript. Удачи;)

+0

Спасибо! Я бы сказал вам, но мне не хватает репутации, чтобы это сделать. Но знайте, что вы были очень полезны. – user1385816

4

конвертер Найджела CSV к списку лучшее, что я видел ...

http://macscripter.net/viewtopic.php?pid=125444#p125444

Для примера, используйте следующие параметры:

set csvText to "family | type 
Doctor | Pediatrics 
Engineer | Chemical" 
csvToList(csvText, {separator:"|"}, {trimming:true}) 

v2

set csvText to read "/Users/user1385816/Desktop/yourfile.csv" 
csvToList(csvText, {}, {trimming:true}) 
+0

Это лучшее, что я видел сам. Но все решения в AppleScript кажутся немного медленными с большим количеством данных (30 тыс. Строк и более). Тогда вы должны найти производительность где-то еще. Я использую автономную программу командной строки, написанную на C, которая читает в CSV-файле и записывает AS 2-мерный список. Затем выполните «run script», чтобы принудить строку к списку. –

+0

Ницца. Хотя я уверен, что это не так быстро, я включил сценарий Найджела в один, который импортирует все в базу данных sqlite3. После того, как я закончил с данными, я экспортирую его обратно в csv. – adayzdone

+0

Прохладный. Мне просто интересно, на этом конкретном обработчике параметр csvText меня смущает. Могу ли я просто установить файл csv в csvText? – user1385816