Я начинаю изучать Go, и я немного озадачен тем фактом, что он включает EOF при использовании функции ioutil.ReadFile. Я хочу, например, прочитать файл и проанализировать все его строки в разделителе полей.Предотвращение ReadFile или ReadAll от чтения EOF
Пример входного файла:
CZG;KCZG;some text
EKY;KEKY;some text
A50;KA50;some text
UKY;UCFL;some text
MIC;KMIC;some text
K2M;K23M;some text
Это то, что я делаю, чтобы прочитать и разобрать этот файл:
import(
"fmt"
"log"
"io/ioutil"
"strings"
)
func main() {
/* Read file */
airportsFile := "/path/to/file/ad_iata"
content, err := ioutil.ReadFile(airportsFile)
if err != nil {
log.Fatal(err)
}
/* split content on EOL */
lines := strings.Split(string(content), "\n")
/* split line on field separator ; */
for _, line := range lines {
lineSplit := strings.Split(line, ";")
fmt.Println(lineSplit)
}
}
string.Split функция добавляет пустой элемент в конце среза lineSplit, когда его видит EOF (ничего не анализировать). Поэтому, если я хочу получить второй индекс этого фрагмента (lineSplit[1]
), я столкнулся с panic: runtime error: index out of range
. Я должен ограничить диапазон, делая это
/* split line on field separator ; */
lenLines := len(lines) -1
for _, line := range lines[:lenLines] {
lineSplit := strings.Split(line, ";")
fmt.Println(lineSplit[1])
}
Есть ли лучший способ, если я хочу сохранить с помощью ReadFile для его краткости?
Та же проблема возникает при использовании ioutil.ReadAll
В конце файла нет конца '\ n'. Ваше решение с 'bufio.Scanner' отлично работает, но я просто задался вопросом, есть ли возможность запретить ioutil.ReadFile добавлять пустой срез, когда он видит EOF. Если его нет, я буду использовать bufio. Благодарю. – ripat
Как вы подтвердили, что нет конечной новой строки? Некоторые редакторы фактически не показывают их как пустую строку, но добавляют их молча в любом случае. Попробуйте 'od -tc/path/to/file/ad_iata' и посмотрите. – Thomas
Я стою исправлены. В конце последней строки есть конечный '\ n'.Это делает поведение «ioutil.ReadFile» более логичным для меня. Я узнал что-то от вас. Еще раз спасибо. – ripat