Możliwość odczytu (i zapisu) pliku tekstowego do iz tablicy ciągów jest moim zdaniem dość powszechnym wymaganiem. Jest to również bardzo przydatne, gdy zaczynasz od języka, który eliminuje początkową potrzebę dostępu do bazy danych. Czy ktoś istnieje w Golangu?
na przykład
func ReadLines(sFileName string, iMinLines int) ([]string, bool) {
i
func WriteLines(saBuff[]string, sFilename string) (bool) {
Wolałbym użyć istniejącego zamiast duplikować.
Odpowiedzi:
Od wydania Go1.1 istnieje interfejs API bufio.Scanner, który może z łatwością odczytywać wiersze z pliku. Rozważmy następujący przykład z góry, przepisany za pomocą programu Scanner:
źródło
Jeśli plik nie jest zbyt duży, można to zrobić za pomocą funkcji
ioutil.ReadFile
istrings.Split
:Możesz przeczytać dokumentację dotyczącą pakietów ioutil i strings .
źródło
"io/ioutil"
\r
. Więc może masz\r
dołączone do każdego elementu.Nie można zaktualizować pierwszej odpowiedzi.
W każdym razie, po wydaniu Go1 jest kilka istotnych zmian, więc zaktualizowałem, jak pokazano poniżej:
źródło
Możesz użyć os.File (który implementuje interfejs io.Reader ) z pakietem bufio . Jednak te pakiety są budowane z myślą o stałym zużyciu pamięci (bez względu na to, jak duży jest plik) i są dość szybkie.
Niestety sprawia to, że wczytywanie całego pliku do pamięci jest nieco bardziej skomplikowane. Możesz użyć bytes.Buffer, aby połączyć części linii, jeśli przekraczają limit linii. W każdym razie radzę spróbować użyć czytnika linii bezpośrednio w swoim projekcie (zwłaszcza jeśli nie wiesz, jak duży jest plik tekstowy!). Ale jeśli plik jest mały, poniższy przykład może Ci wystarczyć:
Inną alternatywą może być użycie io.ioutil.ReadAll, aby od razu wczytać cały plik, a następnie wykonać cięcie po linii. Nie daję ci wyraźnego przykładu zapisywania wierszy z powrotem do pliku, ale w zasadzie jest
os.Create()
to pętla, po której następuje pętla podobna do tej w przykładzie (patrzmain()
).źródło
gob.Encode()
do tego celu. Rezultatem jest plik binarny zamiast pliku tekstowego rozdzielanego znakami nowej linii. Ten plik może zawierać wszelkiego rodzaju dane, może być wydajnie analizowany, plik wynikowy będzie mniejszy i nie musisz zajmować się nowymi wierszami i alokacją dynamiczną. Więc prawdopodobnie lepiej Ci pasuje, jeśli chcesz po prostu zachować coś do późniejszego użycia w Go.lub
źródło