Por que os mesmos dados ocupam mais espaço em um arquivo de texto do que em um arquivo do Excel?

59

Eu tenho cerca de 100000 linhas de dados. Se eu armazenar esses dados em um formato de arquivo de texto, será necessário mais espaço do que se eu os armazenar em um formato de arquivo do Excel. Por que é que?

user734178
fonte

Respostas:

117

O xlsxformato usado pelo Excel moderno é na verdade um formato compactado. É um arquivo ZIP que contém arquivos de texto (XML) em uma determinada estrutura.

Se você compactar seu arquivo de texto sem formatação com uma ferramenta de compactação ZIP semelhante, deverá obter tamanhos de arquivo semelhantes.

Além disso, conforme mencionado por Bradley Uffner e Morgen nos comentários, o Excel deduplicará seqüências de caracteres idênticas e armazenará apenas uma cópia delas. Não tenho certeza dos ganhos exatos de um método assim, e isso dependerá do seu conjunto de dados, mas a simples compactação zip provavelmente o levará a maior parte do caminho. 1 1


9.1.3 Pacotes físicos

Cada documento Office Open XML é implementado como um arquivo ZIP.

- ECMA-376-1: 2016


1 Meu palpite é que essa desduplicação é mais eficaz quando você tem várias planilhas, pois a compactação zip se aplica independentemente a cada arquivo em um arquivo e apenas a seções limitadas dos dados de uma só vez - armazenando todas as seqüências de caracteres juntas em um único arquivo. deve ser um benefício para a compactação posterior. Mais praticamente, se o seu formato de texto sem formatação estiver em um único arquivo, provavelmente haverá pouca diferença.

Prumo
fonte
2
Isso é ótimo! Ele fornece informações muito boas sobre como os arquivos do Excel são manipulados. Obrigado!
Dominique
3
@ Dominique Se você quiser saber mais, pode brincar com um descompactando-o (por exemplo, com 7zip ou renomeando-o para que ele termine .zip). A especificação também está disponível, mas facilita a leitura.
Bob
3
Eu acho que o excel também usa um dicionário de strings, onde bits de texto idênticos entre células podem ser reutilizados enquanto são armazenados apenas uma vez.
precisa saber é o seguinte
11
Com base na API exposta pela biblioteca ooxml do Apache, um dicionário de cadeias compartilhadas é pelo menos provável.
Morgen
2
As cadeias compartilhadas eram um recurso do Excel mesmo quando ele gravava arquivos XLS (sem x), que eram um formato orientado a registros chamado BIFF dentro de um contêiner OLE. Se você comparar especificações antigas do XLS com o XLSX, verá que o XLSX é apenas uma versão compactada e compactada do BIFF com xmlified. Então, basicamente, a MS não inventou o recurso de cadeia compartilhada para XLSX, onde não faz muito sentido devido à compactação; eles apenas seguiram o caminho mais fácil para transformar XLS em XLSX.
Guntram Blohm
2

A resposta dada está correta, porque o Excel armazena seus dados como xml. Também se deve a isso, que classificar seus dados com eficiência também reduzirá o tamanho do arquivo. Teste você mesmo - digamos que você tenha dados como

A            B                              C
John         Smith-Johnson-Williamson       12345
Sally        Smith-Johnson-Williamson       67890
John         Williams                       34567

Se você classificar apenas por C (uma coluna com todos ou quase todos os valores exclusivos), os valores idênticos de B não serão adjacentes. No xml do Excel, fica assim:

<12345><John><Smith-Johnson-Williamson>
<34567><John><Williams>
<67890><Sally><Smith-Johnson-Williamson>

Se você classificar por B (uma coluna com valores comuns), os valores idênticos serão adjacentes. No xml do Excel, fica assim:

<Smith-Johnson-Williamson><John><12345>
  <Sally><67890>
<Williams><John><34567>

Como essa cadeia longa é idêntica e adjacente, o Excel sabe que pode agrupá-las, semelhante a quando as pessoas escrevem listas e, para repetir parte da linha acima, elas digitam aspas em vez de reescrever a mesma coisa. Não encontrei nenhuma evidência de um dicionário de cadeia compartilhada em minha investigação - apenas esse recuo no lugar do valor do campo repetido.

Eu tinha listas de correio de 250.000 clientes em apenas 11 estados, e em cada registro havia um campo que era uma das duas seqüências de caracteres que identificavam a oferta que eles recebem. Por algum motivo, nossos funcionários estavam acostumados a procurar as pessoas pelo endereço como faladas, por isso foram classificadas na coluna do número da rua, depois no nome da rua, na cidade, etc. CEP, cidade, nome da rua, número da rua e, finalmente, a linha de endereço 2, o tamanho do arquivo foi reduzido incrivelmente. Examinei o xml descompactado no arquivo classificado em cada sentido para ver o que estava acontecendo, e o acima foi o que deduzi. Se houver vários campos com mais de cinco caracteres, digamos, mas os valores tiverem um conjunto limitado (por exemplo, disposições de ticket como 'resolvido', 'rejeitado', 'aprovado' etc.),

CompanionCube
fonte
Olá CompanionCube, este é um conhecimento extremamente impressionante. !!! Muito obrigado.
user734178
-5

Se você tiver um número como 3,14159265359, precisará de 13 bytes para armazená-lo em um arquivo de texto; se você armazenar esse número como um flutuador, precisará de apenas 4 bytes.

Mirko Ebert
fonte
19
Embora possa ter sido o caso com xls(BIFF), acho que não xlsxfaz isso. xlsxarmazena todos os dados em arquivos XML, que não executam codificação binária de números - eles são convertidos e armazenados como cadeias de texto. Ainda estou tentando encontrar a seção relevante da especificação, mas meu teste empírico (por exemplo, extração de um documento salvo) mostra que ele 1.123está literalmente armazenado como uma seqüência de 5 caracteres em XML.
Bob
14
ECMA-376-1: 2016 § 18.3.1.4 c(Célula) mostra que as células armazenam seus dados em vtags, conforme definido em ECMA-376-1: 2016 § 18.3.1.96 v(valor da célula), onde dizem Os valores possíveis para esse elemento são definidos pelo tipo simples ST_Xstring (§22.9.2.19). - eles fornecem exemplos como <v>28086.3541666667</v>onde os dados são claramente armazenados como uma string.
Bob
4
@gerrit Infelizmente Excel não interpretar números como flutua dentro do programa, levando a problemas interessantes, como números de telefone caindo nos últimos dígitos. Ele simplesmente não os salva no disco como flutuadores (mais?).
Bob
2
@Bob este é também o caso para xlsb, que é altamente recomendado para enormes folhas
phuclv
2
Não sei por que essa resposta recebe tantos votos negativos. O OP não especificou qual o formato Excel então tecnicamente esta é também uma resposta válida
phuclv