2015-10-20 2 views
0

Извините, что опубликовал такой элементарный вопрос, но меня путают все различные учебники и примеры (и слэши, дефисы и обратные метки о моем), поэтому я решил Я бы получил чей-то опытный вклад.Используйте серию Unix, чтобы превратить csv в объект javascript

У меня есть файл CSV, который, очевидно, через запятую, которая имеет несколько сот строк, которые выглядят следующим образом:

abcd-3096,62#,,100,,,25,,75,3, , и он должен быть отформатирован следующим образом:

{name: 'abcd-3096', weight : 62, some-field1: null, class: 100, some-field2: null, some-field3: null, unit-weight : 25, some-field4 : null, capacity : 75, } 

Я знаю, что вы будете либо хотите использовать awk или sed, чтобы заменить его, и я более чем умею делать форматирование в нескольких командах.

Я не ожидаю, что кто-нибудь отформатирует всю строку для меня, но я надеюсь, что кто-то может показать мне, как добавить столбец с некоторым текстом. Кажется, я не могу найти надежное объяснение команды в любом месте в Интернете.

+0

Будет ли какое-либо из полей вашего CSV когда-либо содержать запятую? –

+0

Нет, мы можем предположить, что запятые только очерчивают поля или столбцы. – Csteele5

+0

Почему не Perl однострочный? – Vidul

ответ

2

Вы можете использовать отрицающие символьные классы как [^,] для этого:

sed -r 's/^([^,]*),([^,]*),([^,]*)/{ name: "\1", weight: "\2", somefield1: "\3" }/' file.csv 

Пример использует только 3 группы для простоты ... но вы получите идею.

Если ваша система не поддерживает sed -r (расширенный синтаксис регулярных выражений), вам нужно использовать \(group\) вместо (group):

sed 's/^\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)/{ name: "\1", weight: "\2", somefield1: "\3" }/' file.csv 

В случае, если вы не необходимости использовать СЕПГ, вам можно также использовать Баш непосредственно:

while IFS=',' read -r name weight somefield1 class somefield2 somefield3 unitweight capacity rest 
do 
    echo -e "{ name: \"$name\", weight: \"$weight\", somefield1: \"$somefield1\","; 
    echo -e " class: \"$class\", somefield2: \"somefield2\" somefield3: \"$somefield3\","; 
    echo -e " unitweight: \"$unitweight\", capacity: \"$capacity\" }"; 
done < file.csv 
IFS=$' \t\n' 

(взято из this ответа на koola)

+0

(Все эти решения предполагают, что у вас нет запятых в ваших данных, как вы указали в своем комментарии к своему вопросу.) –

+0

Это отличный ответ. Для вашего первого примера, похоже, вы пытаетесь отрицать одно и то же 3 раза. Это компенсирует тройную запятую часть моих данных? – Csteele5

+0

'([^,] *)' означает * "захватывать 0 или более символов, которые не являются запятой" *. Итак, для 2 значений шаблон имеет значение '([^,] *), ([^,] *)', сопоставляя «значение, затем запятую, затем значение». Для каждой дополнительной группы вы должны добавить ', ([^,] *)'. –

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