2016-10-26 2 views
-1

Я пытаюсь преобразовать CSV-файл в массив javascript.jQuery/JavaScript - Преобразование CSV в массив

Вот мой код:

var segments = { 
    'Segment_1':'inves_cast', 
    'Segment_2':'foreged_prod', 
    'Segment_3':'air_prod', 
    'Segment_5':'worldwide', 
    'Segment_6':'structurals' 
}; 

var divisions = { 
    'Division_1':'structurals', 
    'Division_2':'airfoils', 
    'Division_3':'wyman', 
    'Division_4':'energy', 
    'Division_5':'fasteners', 
    'Division_6':'struc_comp', 
    'Division_7':'mech_hard', 
    'Division_8':'engine_prod', 
    'Division_9':'corp', 
    'Division_10':'aero', 
    'Division_11':'timet', 
    'Division_12':'', 
    'Division_13':'spec_metals', 
}; 

var csv = $.get('/path/to/locations.csv'); 

console.log(csv); 

var locationArray = transformLocationData(csv); 

function transformLocationData(obj) { 
    var lineArray = []; 
    if(obj && obj.data) { 
     var text = (data.responseText); 
     lines = text.split('\n'); 
     for(var line in lines) { 
      var lineTokens = line.split(','); 
      lineArray = [ 
       lineTokens[0], 
       lineTokens[1], 
       lineTokens[3], 
       lineTokens[4], 
       lineTokens[5], 
       lineTokens[6], 
       lineTokens[11], 
       lineTokens[12], 
       lineTokens[13], 
       lineTokens[14], 
       lineTokens[15], 
       segments['Segment_' + lineTokens[8]], 
       divisions['Division_' + lineTokens[9]] 
      ]; 
     } 
    } 
    console.log(lineArray); 
} 

Так что я пытаюсь сделать, это нам AJAX, чтобы получить файл CSV, а затем разделить «responseText» первого линии и Второй петли через те линии и разделить его запятыми, а затем создать массив на основе этих номеров строк.

Вот картина данных я получаю обратно от вызова AJAX: enter image description here

С лог последней консоли (console.log(lineArray);) возвращает пустой массив или на самом деле это просто возвращает данные, находится в var lineArray = []; который пуст, если я заполню его данными var lineArray = ["Lexus", "Audi", "BMW"]; Он вернет этот массив.

Вот plunker со всем кодом: https://plnkr.co/edit/CoZGfr6S9R5LDqR1drzq

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

+0

Не используйте 'для ... in' для перебора массивов – vlaz

+0

@vlaz, тогда почему бы вам не дать мне альтернативу? Вместо того, чтобы просто сказать мне не использовать его :). Как я уже сказал в оригинальном вопросе, я новичок в этом. И для того, чтобы быть новым (я думаю), у меня есть хороший стартовый код. Не могли бы вы рассказать. Особенно, если есть лучший способ сделать это, я хотел бы узнать для будущей справки. Любая помощь приветствуется. – agon024

+0

Поиск информации о 'for ... in' или даже googling 'for in arrays javascript' должен предоставить вам достаточно информации, которую я не хотел повторять, но если вы так хотите:' for ... in' следует использовать перебирать _объекты_, поскольку он проходит через все свойства. С массивами он будет перебирать вещи, которые вы, вероятно, не намереваетесь - в прошлом одним из них было свойство 'length', оно также не будет зацикливаться в том порядке, который вы обязательно захотите, и он может пропустить некоторые записи, которые вы ожидаете. Используйте обычный цикл 'for' или ES6' для ...of', или функциональные 'array.forEach' и' .map', '.find',' .every' и т. д. – vlaz

ответ

2

Вы заменяете lineArray на новый массив каждый раз, и вы регистрируете массив только на конце цикла. Возможно, CSV имеет пустую строку в конце.

Если Вы желаете массив массивов, сделать это вместо того, чтобы:

var lineArray = []; 
if(obj && obj.data) { 
    var text = (data.responseText); 
    lines = text.split('\n'); 
    for(line in lines) { 
     var lineTokens = line.split(','); 
     lineArray.push([ 
      lineTokens[0], 
      lineTokens[1], 
      lineTokens[3], 
      lineTokens[4], 
      lineTokens[5], 
      lineTokens[6], 
      lineTokens[11], 
      lineTokens[12], 
      lineTokens[13], 
      lineTokens[14], 
      lineTokens[15], 
      segments['Segment_' + lineTokens[8]], 
      divisions['Division_' + lineTokens[9]] 
     ]); 
    } 
} 
console.log(lineArray); 

Update:

Кроме того, вы не обрабатывает результаты из запроса Ajax должным образом. Эта строка:

var csv = $ .get ('/ path/to/locations.csv');

... не возвращает CSV. Скорее, он возвращает обещание (вроде ...). Поэтому вы не можете разобрать csv. Скорее, дождитесь результатов. Изменение кода:

$.get('/path/to/locations.csv').then(function (csv) { 
    var locationArray = transformLocationData(csv); 
}, function (err) { 
    // Handle errors 
}); 

Как @vlaz упоминалось, вы также хотите изменить свой цикл от for..in к обычному for цикла:

for (var i = 0; i < lines.length; i++) { 
    var line = lines[i]; 
    // ... 
} 
+0

Ya Я пробовал это, и он все еще дает мне пустой массив. – agon024

+0

все еще не работает с этими изменениями. Консоль по-прежнему показывает пустой массив. Я создал плункер, чтобы вы тоже видели вживую. https://plnkr.co/edit/CoZGfr6S9R5LDqR1drzq – agon024

+0

Вам нужно отредактировать 'transformLocationData' для обработки CSV, а не объекта ответа. Обновление находится здесь: https://plnkr.co/edit/1UnFgUoFsS7eS3DZkjMo?p=preview – Jacob

Смежные вопросы