Escrito por

Artigo Evandro Wendt · 5 hr atrás 2m read

Excel no mundo .xls do IRIS

Trabalhar com arquivos geralmente começa de forma simples: abrir o arquivo, ler e processar. Essa abordagem funciona perfeitamente, até que o arquivo seja um Excel.

Uma Suposição Comum

À primeira vista, um arquivo Excel (.xlsx) parece apenas mais um arquivo de dados, linhas, colunas e valores. Nada incomum. Portanto, é natural assumir que ele pode ser lido da mesma forma que um arquivo .txt ou .csv. Mas é aí que as coisas começam a dar errado.

Por que arquivos Excel se comportam de forma diferente

A principal diferença está em como os dados são armazenados:

-> .txt / .csv - texto simples, linha por linha.

-> .xlsx - formato estruturado e compactado (não é texto simples)

Um arquivo Excel não é, na verdade, um fluxo simples de linhas legíveis. Internamente, ele é um pacote que contém dados estruturados, que os comandos padrão de leitura de arquivos não foram projetados para interpretar.

O que acontece se você tratá-lo como um arquivo de texto?

  • Erros durante a execução

  • Saída com aparência ilegível

Algo importante --> Isso não é uma limitação, é uma incompatibilidade entre a ferramenta e o formato do arquivo.


Formas práticas de lidar

Instead of using only the text based approach, there are better options,

Em vez de usar apenas a abordagem baseada em texto, existem opções melhores:

  • Converter para CSV

  • Python Embutido (bibliotecas como pandas ou openpyxl)

  • Ferramentas de Interoperabilidade do IRIS

Se alguém aqui já trabalhou com arquivos Excel no IRIS ou tem uma abordagem diferente que funcione bem, fique à vontade para compartilhar. :)

Alguns exemplos mencionados abaixo.

	// Example for Reading excel and storing in a text file
ClassMethod ReadDataToFile() [ Language = python ]
{
        #; w ##class(test).ReadDataToFile()
    import pandas as pd
    import iris

    source = r"[input-file-path]\Test.xlsx"
    outfile = r"[output-file-path]\Output.txt"

    df = pd.read_excel(source)
    f = open(outfile, "w", encoding="utf-8")
    data = []
    for index, row in df.iterrows():
        line = " ".join([str(x) for x in row.tolist()])
        line = "\t".join(cleaned_values)
        f.write(line + "\n")
    f.close()
}

/// Example for storing in a global
ClassMethod ReadData() [ Language = python ]
{
        #; w ##class(test).ReadData()
    import pandas as pd
    import iris

    source = r"[input-file-path]\Test.xlsx"
    
    df = pd.read_excel(source)
    g = iris.gref("^zReadFile")
    for index, row in df.iterrows():
        cleaned_values = [str(x).replace("\n", " ").replace("\r", " ") for x in row.tolist()]
        line = "\t".join(cleaned_values)
        g[jobId,index]=line
}