2012-05-27 9 views
21

Szukam wyeksportować tablicę z mojej konsoli heroku do lokalnego pliku CSV.Jak wyeksportować Ruby Array z mojej konsoli Heroku do pliku CSV?

W mojej obecnej sytuacji mam codzienne zadanie rake, które szuka tweetów mówiących o mojej aplikacji. Chciałbym przeanalizować te tweety, aby zobaczyć, o której godzinie się pojawiły, itp:

heroku run console 
tweets = Tweet.all 
code to export tweets into a local CSV file goes here 

Wszelkie pomysły będą mile widziane!

+0

Hi Sergio! Co masz na myśli, jeśli mogę napisać plik tekstowy? –

+0

Jeśli wiesz, jak pisać pliki tekstowe, pisanie tweetów do pliku CSV nie powinno stanowić problemu. –

+0

Nie wiem, jak napisać pliki tekstowe z konsoli Heroku na mój komputer lokalny. Czy mógłbyś powiedzieć mi, jak to zrobić? –

Odpowiedz

27

Nie można uzyskać dostępu do lokalnego systemu plików z poziomu konsoli Heroku. Jedną z opcji jest użycie Tee. Tee wysyła dane wyjściowe zarówno do STDOUT, jak i do pliku, dzięki czemu możesz mieć lokalny rejestr wszystkiego, co zostało wydrukowane.

heroku run console | tee output.txt 
+0

To zawiesza się na 'uruchomionej 'konsoli' dołączonej do terminala ... do góry, run.4296' ... czy to działa dla każdego? (edytuj: formatowanie) –

+0

@ErikTrautman Myślę, że masz rację. To nie działa z najnowszym klientem heroku. – spike

+0

To działało dla mnie z najnowszym klientem heroku, ALE nie widziałem niczego, co piszę. Wprowadziłem moje polecenia na ślepo, a następnie "exit", a po przejrzeniu output.txt wszystko tam było (zarówno moje wejście, jak i pożądane wyjście). – DreadPirateShawn

0

Próbowałem Tee jak sugerowano, ale z jakiegoś powodu zawsze utknął po wyjściu

Running `console` attached to terminal... up, run.1 

Więc skończyło się wysyłając treść csv dla mnie w treści wiadomości w formacie tekstowym. Jeśli masz już skonfigurowaną pocztę elektroniczną, może to być również łatwe rozwiązanie.

+0

Dzięki za podpowiedź Gnomet, podzielenie się uwagami na temat tego, jak posunąć się do przodu i zrobić to? –

+0

Mamy aplikację Rails z ustawieniem Mailer dla użytkowników poczty. Więc dodałem tam metodę, która po prostu wysyła zawartość danej zmiennej do użytkownika. Tak więc w poniższym przykładzie jest PersonMailer, który ma metodę free_content_message (e-mail, zawartość). csv_content = method_that_returns_the_csv_you_want PersonMailer.free_content_message („[email protected]” csv_content) .deliver nie zostały wysyłanie poczty bez poręczy koperty, więc nie może dać bardziej ogólne porady teraz. – Gnomet

6

FWIW można dość łatwo umieścić ciąg znaków z przecinkami i znakami nowej linii, a następnie skopiować wklej do edytora tekstu i zapisać jako .csv, chociaż "wszystkie tweety" mogą być trochę nieporęczne.

tweets = Tweet.all 
@string = String.new() 
@string << Tweet.last.attributes.keys.join(", ") + "\n" # "header" row with attribute names 


tweets.each do |t| 
    @string << t.attributes.values.join(", ") + "\n" 
end 

puts @string #will output string with \n newline which you could then copy paste into your editor and save as a csv 
+1

Połączyć to z File.new ("Nazwa pliku.csv", "w") i można łatwo dodać wyjście CSV do pliku. Uratował mi sporo czasu i możesz go użyć na dowolnym serwerze szyn. –

+0

Jednym z problemów z kopiowaniem/wklejaniem jest próba przechwycenia wystarczającej ilości danych, które przewijają z góry konsoli heroku. – DreadPirateShawn

19

Próbowałem za pomocą Tee jak sugeruje również i utknął na

Running `console` attached to terminal... up, run.4165 

skończyło się prowadzeniem powłoki SSH localhost, a następnie rurami go przez tee.

$ ssh localhost | tee output.txt 
$ heroku run console 

Może nie być najlepszym rozwiązaniem, ale zadziałało u mnie.

+0

Dlaczego to faktycznie rozwiąże ?! Wolę naśladować efekt, ale bez uruchamiania serwera ssh na pulpicie. – matanster

+0

@rome Jest to całkiem sprytne, jeśli działa. – spike

+5

To zadziałało dla mnie, dziękuję za sugestię. Używam OSX. Do ssh do localhost, musiałem włączyć "Zdalne logowanie" w Preferencjach systemowych >> Udostępnianie. – Aaron

1

można wyłożyć do SCP:

my_data = "hello world" 
File.write("tmp/data", my_data) 
`scp tmp/data [email protected]:` 

Może poprosi o serwerze jest nieznany i poprosić o hasło.

+0

Wielkie dzięki rozwiązania. – Robin

0

Próbowałem wykonać następujące czynności z nową konsolą heroku. Mogłem pobrać dzienniki.

  1. typ polecenia skrypt output.txt (ta tworzy plik o nazwie Output.txt do zapisywania dzienników terminal)
  2. otwartą konsolę Heroku i wykonywać polecenia.

  3. po zakończeniu wpisz ctrl + d.

Logi terminali są zapisywane w pliku output.txt.

1

Można również użyć rails runner aby uruchomić wiersz kodu lub trzy na Heroku i rury (lub tee) wyniki do pliku:

heroku run rails runner \'Tweet.all.to_csv\' -a my-app-name | all_tweets.csv 

można wyłączyć szyn logowaniem jeśli to pokazuje się w pliku i przycinaj górę pliku, jeśli otrzymujesz w swoim pliku startowym logowanie typu "Running` rails runner ", ale powinno to być łatwe.

1

można uruchomić Ruby na przykład Heroku:

echo 'p User.first' | heroku run --no-tty 'ruby -W0 -r ./config/environment' > output.txt

To spowoduje wydrukowanie pierwszego użytkownika do pliku output.txt.

Możesz także uruchomić lokalny skrypt na Heroku, podłączając go do wejścia standardowego.

cat my_script.rb | heroku run --no-tty 'ruby -W0 -r ./config/environment' > output.txt

Należy pamiętać, że jest to możliwe, że dostaniesz jakiś niechciany tekst (jak ostrzeżeń), który pojawi się na początku pliku output.txt. Będziesz musiał przyciąć go ręcznie lub za pomocą polecenia przycinania, takiego jak:

tail -n +4 -f, które nie wydrukuje pierwszych 4 linii.

Oto pełny przykład:

cat my_script.rb | heroku run --no-tty 'ruby -W0 -r ./config/environment' | tail -n +4 -f > output.txt

Powiązane problemy