Nano Hash - криптовалюты, майнинг, программирование

Чтение значений из файла xls в golang в системе Linux

Я пишу программу для чтения файла xls в Go. Я использую пакет github.com/extrame/xls. Я хочу прочитать каждую ячейку, если она не пуста. (Обратите внимание, что в некоторых строках будут значения во всех 11 столбцах, а в некоторых нет.)

Мой код:

if xlFile, err := Open("Table.xls", "utf-8"); err == nil {
    if sheet1 := xlFile.GetSheet(0); sheet1 != nil {
        fmt.Print("Total Lines ", sheet1.MaxRow, sheet1.Name)
        col1 := sheet1.Rows[0].Cols[0]
        col2 := sheet1.Rows[0].Cols[0]
        for i := 0; i <= (int(sheet1.MaxRow)); i++ {
            row1 := sheet1.Rows[uint16(i)]
            col1 = row1.Cols[0]
            col2 = row1.Cols[11]
            fmt.Print("\n", col1.String(xlFile), ",", col2.String(xlFile))
        }
    }
}

Это дает следующую ошибку:

panic: runtime error: invalid memory address or nil pointer dereference

Потому что ячейка 11 пуста для некоторых строк.

Пожалуйста, посоветуйте лучший метод или решение.

27.04.2016

Ответы:


1

Проверяя репо, о котором вы упоминаете, есть файл row.go, в котором определена структура Row следующим образом:

type Row struct {
    info *RowInfo
    Cols map[uint16]contentHandler
}

Он содержит карту Cols, ключи которой являются значениями uint16. Потому что в go вы можете проверить, существует ли ключ карты, следующим образом:

if col2, ok := row1.Cols[11]; ok { }

это означает, что вы можете проверить, не пусты ли ячейки, проверив, содержат ли они ключ.

if col2, ok := row1.Cols[11]; ok { 
    fmt.Print("\n", col2.String(xlFile))
}
27.04.2016
  • Отлично, что помогло. 27.04.2016
  • чистый ответ, помог с моей проблемой 2 04.12.2019

  • 2

    Я предполагаю, что если у вас есть пустые конечные столбцы, размер среза Cols равен количеству заполненных столбцов.

    В этом случае просто выполните:

    if len(row1.Cols) < 12 {
     // Whatever you want to do with < 12 columns 
    } else {
     // Use Cols[11] (12th column) here
    }
    

    Если вам нужны только первый и последний столбцы, вы можете сделать: rows1.Cols[0] и rows1.Cols[len(row1.Cols)-1], которые будут работать с произвольными широкими строками.

    Если могут быть пустые строки, сначала проверьте len(rows1.Cols) == 0, чтобы убедиться, что вы не пытаетесь получить доступ к несуществующим данным.

    27.04.2016
  • будет ли это работать, если в середине тоже есть пустая ячейка? скажем, ячейка 2, ячейка 4 тоже может быть пустой. поэтому я хочу знать, пуста ли эта конкретная ячейка 27.04.2016

  • 3

    Вы пытались проверить длину Cols до того, как получили Cols[11]?

    if len(row1.Cols) > 10 {
      col2 = row1.Cols[11]
    }else{
      col2 = Col{}
    }
    
    27.04.2016
  • будет ли это работать, если в середине тоже есть пустая ячейка? 27.04.2016
  • Да, это будет. Он может получить доступ к Cols[11], если только Cols имеет 12 или более элементов. 27.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..