Как правильно прочитать строку файла в массив? - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть такой файл:

1234 1234 "First Name" "Last Name"

И у меня есть такая функция bash:

function somePeoples()
{
  body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
  echo $body
}

, которая содержится в сценарии bash, который я бы использовал вкомандная строка.После этого я делаю следующее для проверки функции:

$ arr=(1234 1234 "First Name" "Last Name")
$ somePeoples "{arr[@]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
$ somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"

Теперь давайте вернемся к файлу, который содержит такие строки:

input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"

Я пытаюсь прочитать каждую строку вфайл через цикл for с ограниченным количеством, потому что я точно знаю, сколько строк в файле.Хитрость заключается в том, чтобы прочитать каждую строку и поместить каждую строку в массив для передачи в функцию somePeoples.Поэтому я делаю скрипт, который использует другой скрипт для этой функции.Давайте просто назовем его клиентским скриптом и притворимся, что он на самом деле зацикливается:

the client script:
arr=(`sed -n "1p" input.txt`)
somePeoples "${arr[@]}"

Но, к моему ужасу, получается:

$ "id":"1234","num":"1234","name":""First,"lname":"Name""

Кроме того, попытка сделать то же самоерезультат

somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
somePeoples `sed -n "1p" input.txt`

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

На самом деле я пытаюсь подготовить тело запроса для передачи в cURL в формате jSON, а входные параметры содержатся в файле длиной в сотни строк.Но я думаю, что материал cURL не имеет отношения к этому вопросу, так как я воспроизвел проблему только через bash.

Ответы [ 3 ]

1 голос
/ 21 ноября 2010

Если, как вы говорите, исходный файл данных находится в формате CSV, то вам, вероятно, лучше сделать что-то простое, например

IFS=, while read id num name lname; do
    ...
done <input.txt
1 голос
/ 21 ноября 2010

В действительности это не относится к вопросу о том, почему цитирование не работает (я полагаю, что вы пробовали одинарные кавычки), но если приемлемо быстрое и грязное решение, вы можете преобразовать пробелы во что-то еще через регулярное выражение, и обратно в пробелы, когда это необходимо

0 голосов
/ 21 ноября 2010

Хорошо, вот что я сделал после преобразования входного файла в CSV:

ORIG_IFS=$IFS
IFS=$(echo -en ",")
arr=(`sed -ns "1p" input.txt`) # nvm the extension
IFS=$ORIG_IFS
somePeoples "${arr[@]}"

Это приводит к выводу:

"id":"1234","num":"1234","name":""First Name"","lname":""Last Name""

Цитируемые строки получают двойные двойные кавычки. Почти рядом. Может мне сначала нужно очистить входной файл?

sed -e 's/"//g' < input.txt > input.txt.new

И вот что я использовал, чтобы наконец получить желаемый результат. Спасибо, ребята :) До сих пор не знал об IFS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...