Цикл через CSV - PullRequest
       8

Цикл через CSV

1 голос
/ 15 марта 2012

Я пишу сценарий оболочки bash, и у меня возникают проблемы с разделением stdout csv и последующим циклом по нему.

Я получаю данные из stdout базы данных. Он разделен запятыми, и каждая строка находится на отдельной строке. Я храню это в переменной csv. У меня есть то же самое для моей переменной данных. Я получаю эти данные из stdout из URL-адреса, который возвращает CSV ... опять же, он разделен запятыми, и каждая строка имеет свою собственную строку.

Ниже \ n означает, что это новая строка.

Я знаю, как перебирать и получать любые столбцы для csv, используя read (см. Ниже). Так что, когда я повторяю $ col1, он показывает два результата, чего я и ожидаю.

Вот чего я не понимаю: Затем я хочу получить для каждого из $ col1, я хочу увидеть, равняется ли $ col1 каким-либо из данных первого столбца переменной $ data. Если он существует (он должен существовать всегда, если не было проблемы), добавьте $ col1 из csv ко всем данным переменной данных, чтобы добавить эти данные для формирования stdout csv.

csv=$("csv",123\n"csv2",456)
data=$("data1",123\n"data2",456)

echo "$csv" | while IFS=',' read -r col1 col2;do
echo "$col1"
done

пример того, что нужно:

if $csv[$col1] == [any of the values of $data[$col1]] then;
echo $csv[$col1],$data[all of it]

1 Ответ

7 голосов
/ 15 марта 2012

Я собираюсь переформатировать ваши данные как:

ДАННЫЕ

 Col #1    Col #2
 =====     ====
 data1     123
 data2     456

CSV

 Col #1    Col #2
 ====      ====
 csv       123
 csv2      456

Правильно ли настроена эта настройка?Я знаю, что это будут файлы CSV, но я хочу убедиться, что я понимаю ваши данные структура .

Теперь вы сказали:

I [...] хочу получить для каждого из $ col1. Я хочу увидеть, равняется ли $ col1 каким-либо из данных первого столбца переменной $ data.

Вы хотите сопоставить столбец № 1 из ДАННЫЕ со столбцом № 1 из CSV .В вашем наборе два столбца № 1 из обоих наборов не совпадают.Вы имели в виду Колонку № 2?

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

DATA

CVS Value    Col #1     Col #2
=========    ======     ======
csv          data1      123
csv2         data2      456

(но в формате CSV, конечно).

Это правильно?

Если у вас достаточно современная версия BASH, вы можете использовать ассоциативные массивы.Это позволяет вам иметь понятие ключ , равный значению .

Допустим, вы создаете ассоциированный массив из DATA и CSV, где массив имеет ключпо столбцу № 2 вы можете затем пройти через массив и определить, есть ли соответствующее значение, и вывести данные так, как вам нужно.

Вы можете установить значение ассоциативного массива следующим образом:

my_array[key]="value"

Вы можете получить значение, связанное с ключом, как это:

echo "${my_array[key]}"

Вы можете получить список всех значений, как это:

echo "${my_array[*]}"

Вы можете получить все ключивот так:

echo "${my_array[@]}"

Вот быстрая и грязная программа.Вы, вероятно, хотите что-то проверить, что у вас нет дубликатов ключей при создании массива, и что конкретный ключ имеет значение, связанное с ним при печати массива:

#! /bin/bash
csv="csv,123
csv2,456"

data="data1,123
data2,456"

# Create the Data Array Hash keyed by Col #2
while IFS="," read -r col1 col2
do
    data_array[$col2]=$col1
done <<EOD
$data
EOD


# Create the CSV Array Hash keyed by Col #2
while IFS="," read -r col1 col2
do
    csv_array[$col2]=$col1
done <<EOD
$csv
EOD

#For each key in Data Hash, print out corresponding keyed value in CSV Hash
for key in "${!data_array[@]}"
do
    echo "$key: ${data_array[$key]} ${csv_array[$key]}"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...