Люди, я задавал этот вопрос 5 раз здесь и получил 5 отдельных битов кода от суперпользователей, у которых все * не удалось.

Проблема: у меня есть биржевая информация, возвращаемая в текстовый файл из API финансов Yahoo.

Проблема в том, что числовые строки, возвращенные из таких, содержат запятые и пробелы в них, что является кошмаром для разделения в Excel. Excel хочет разделить 670 000 000 на 3 отдельных значения и разделить их на 3 отдельных столбца, что является шуткой.

Как мне получить 670 000 000, чтобы выглядеть как 670000000.

Кто может решить эту загадку, которая так много не удалось. Этот скрипт ниже является последним провалом.

cd desktop/quoteUpdate
while true
do
 curl -o quotes.txt -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
echo UPDATED:
date
sleep 5
done

4 ответа4

1

Я думаю, у меня есть решение для вас ....

cd desktop/quoteUpdate
while true
do
  curl  -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"|sed -e 's/,/_/1' -e 's/,/_/1' -e's/\(.*\),/\1_/' -e 's/,//g' -e 's/_/,/g' > quotes.txt
  echo UPDATED:
    date
    sleep 5
  done
done

Дайте это попробовать .... Вы можете добавить данные в файл quotes.txt, просто изменив> quotes.txt на >> quotes.txt

0

От всей моей головы это уродливое решение должно сработать. Замените вашу строку sed следующим:

awk 'BEGIN{FS="\"";OFS="\"";}{gsub(",","",$5);$5=","$5;print $0}' quotes.txt > UPDATED_quotes.txt

Я обновлю этот пост, если найду более элегантный ответ.

0

Что вы получаете от Yahoo! это данные в CSV-формате. Формат слишком сложен для bash (или даже sed или awk) для правильного разбора в одной строке. (Будучи полностью способным к работе с машиной Тьюринга, любой инструмент может это сделать, это будет просто не красиво.)

Ваша непосредственная проблема с приведенным выше сценарием состоит в том, что sed не предоставляется никаких входных данных для работы, поэтому ваш сценарий зависает (после завершения curl ), потому что sed ожидает на stdin . Возможно, вы хотите добавить "quotes.txt" в текущую командную строку sed :

sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' quotes.txt

Но как только вы справитесь с этим, вы все равно будете несчастны, потому что команда sed не анализирует CSV-данные как таковые. Вам понадобится какой-нибудь инструмент для обработки CSV - найдите пакет для разбора CSV, написанный для вашего любимого языка сценариев. В случае Tcl, например, CSV-синтаксический анализ доступен как часть tcllib .

Наконец, если вам действительно не нужно правильно обрабатывать все возможности CSV, а только убедиться, что числа в третьем столбце понятны Excel, вы можете обмануть что-то вроде:

curl -o - -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1" | \
    awk -F, '{
        sub("^ *", "", $3);  # Start with 3rd field by stripping leading spaces
        for (i = 4; i < NF; i++) # Append other fields to 3rd - but the last one
            $3 = $3 $i;
        print $1 "," $2 "," $3 "," $NF
    }'

Вышеуказанный вызов отправляет данные непосредственно из curl в awk (в обход промежуточного создания файла). Если вам нужны данные в файле (например, для загрузки в Excel), перенаправьте в него окончательный вывод awk :

.... awk ..... > quotes.csv

Ничего специфичного для bash в этом примере, кстати, любая оболочка не подойдет. Обратите внимание, что этот awk скрипт только изменяет третий столбец (добавляя к нему последующие "столбцы", кроме самого последнего - NF). Также обратите внимание, что произойдет сбой, если в имени одной из корпораций будет запятая. Если это проблема для вас, этого можно избежать, используя кавычки (") вместо запятых, чтобы найти числа, которые должны быть объединены вместе ... Но лучше всего, опять же, будет относиться к данным как к правильному CSV с помощью расширения с поддержкой CSV для вашего любимого языка сценариев.

0

Используйте perl вместо sed

perl -pe 's/,(?=\d{3}(?![.]))//g'

замените запятую (за которой следуют цифры дерева без запятой после запятой) ничем.

О, только что видел, что вы также хотите, чтобы пробелы урезали

perl -pe 's/,[ ]+/,/g;s/,(?=\d{3}(?![.]))//g'

 

Это следует использовать в рамках вместо «sed», например

#!/bin/sh
while true
do
  clear
  date
  curl -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"|\
    perl -pe 's/,[ ]+/,/g;s/,(?=\d{3}(?![.]))//g'| tee quotes.csv
  cat quotes.csv| sed -e 's/,/\t/g'> quotes.xls
  sleep 5
done

Знаете ли вы, что Excel с готовностью откроет CSV-файл "как есть"
если он заменен запятыми на вкладки и имеет расширение .xls.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .