2015-01-16 1 views
-2

Я пытаюсь написать сценарий, который будет динамически генерировать некоторые шаблоны InDesign, используя значения, содержащиеся в разных столбцах локального файла csv.Как я могу разобрать csv с javascript для не-веб-приложения?

По-видимому, существует несколько способов приблизиться к этому для приложения-браузера, однако я не могу найти что-либо для не-веб-приложений, и все попытки до сих пор не удались.

nb: данные созданы на окнах, используя excel. Я редактирую мой ящик Linux и запускаю скрипт на mac, поэтому мне нужно решение, которое учитывает все это.

Это то, что я до сих пор, включая некоторые полезные код здесь: http://www.bennadel.com/blog/1504-ask-ben-parsing-csv-strings-with-javascript-exec-regular-expression-command.htm

// target the latest version of InDesign 
#target "InDesign-10" 

// This will parse a delimited string into an array of 
// arrays. The default delimiter is the comma, but this 
// can be overriden in the second argument. 
// http://www.bennadel.com/blog/1504-ask-ben-parsing-csv-strings-with-javascript-exec-regular-expression-command.htm 

function CSVToArray(strData, strDelimiter){ 
    // Check to see if the delimiter is defined. If not, 
    // then default to comma. 
    strDelimiter = (strDelimiter || ","); 
    // Create a regular expression to parse the CSV values. 
    var objPattern = new RegExp(
     (
      // Delimiters. 
      "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" + 
       // Quoted fields. 
       "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + 
       // Standard fields. 
       "([^\"\\" + strDelimiter + "\\r\\n]*))" 
     ), 
     "gi" 
    ); 
    // Create an array to hold our data. Give the array 
    // a default empty first row. 
    var arrData = [[]]; 
    // Create an array to hold our individual pattern 
    // matching groups. 
    var arrMatches = null; 
    // Keep looping over the regular expression matches 
    // until we can no longer find a match. 
    while (arrMatches = objPattern.exec(strData)){ 
     // Get the delimiter that was found. 
     var strMatchedDelimiter = arrMatches[ 1 ]; 
     // Check to see if the given delimiter has a length 
     // (is not the start of string) and if it matches 
     // field delimiter. If id does not, then we know 
     // that this delimiter is a row delimiter. 
     if (
      strMatchedDelimiter.length && 
       (strMatchedDelimiter != strDelimiter) 
     ){ 
      // Since we have reached a new row of data, 
      // add an empty row to our data array. 
      arrData.push([]); 
     } 
     // Now that we have our delimiter out of the way, 
     // let's check to see which kind of value we 
     // captured (quoted or unquoted). 
     if (arrMatches[ 2 ]){ 
      // We found a quoted value. When we capture 
      // this value, unescape any double quotes. 
      var strMatchedValue = arrMatches[ 2 ].replace(
       new RegExp("\"\"", "g"), 
       "\"" 
      ); 
     } else { 
      // We found a non-quoted value. 
      var strMatchedValue = arrMatches[ 3 ]; 
     } 
     // Now that we have our value string, let's add 
     // it to the data array. 
     arrData[ arrData.length - 1 ].push(strMatchedValue); 
    } 
    // Return the parsed data. 
    return(arrData); 
} 

var csv = CSVToArray(File("source.csv"), ","); 

// create new document using specified presets 
var myDocument    = app.documents.add(); 
var myTextFrame    = myDocument.pages.item(0).textFrames.add(); 
myTextFrame.geometricBounds = ["6p", "6p", "24p", "24p"]; 
myTextFrame.contents  = csv[0]; 

нет worky, совет оценил

+0

Что вы подразумеваете под «не-веб-приложениями», как вы собираетесь запускать сценарий? Узел? – atmd

+1

это не приложение для браузера. это скрипт для Adobe InDesign. Он запускается с использованием инструмента ExtendScript Toolkit –

+1

В чем проблема? Вы успешно прочитали файл и просто нуждаетесь в парсере CSV для данных, которые у вас есть в переменной? – Quentin

ответ

2

Для простейшего случая это действительно тривиально:

function parseCSV(text) { 
 
    return text.split('\n').map(function(row) { 
 
     var r = []; 
 
     row.replace(/""/g, "\x01").replace(/"(.*?)"|([^\s,]+)/g, function(_, $1, $2) { 
 
      r.push(($1 || $2).replace(/\x01/g, '"')); 
 
     }); 
 
     return r; 
 
    }); 
 
} 
 

 
// example: 
 

 
var t = 
 
    ' "lorem ipsum", dolor,      sit\n' + 
 
     ' consectetur, "adipiscing ""elit"" sed", eiusmod'; 
 

 
csv = parseCSV(t); 
 
document.write(JSON.stringify(csv));

Однако, если ваши csvs нестандартны, это будет немного сложнее. Я не знаю, можете ли вы использовать модули узлов, например csv, в сценариях Adobe, если нет, вы можете по крайней мере посмотреть на их источники.

+0

thanks georg , Как я могу изменить это, чтобы прочитать файл source.csv? я просто звоню, как у меня в моем посте? как читать значение в строке 5 столбца с именем «столбец 3»? –

+0

Я получаю ошибку выполнения во время этой строки: return text.split('\n').map(function(row) {