Transpor uma tabela cujas linhas deviam ter sido colunas
Publicado a 22/07/2026 · 13 min de leitura · Ferramentas para programadores
Daniel Okonkwo — Programador front-end e redator de Tecnologia na OneKitly
Desempenho web · Formatos de ficheiro
Verificado a partir de 4 fontes
Transpor troca linhas e colunas: a célula [l][c] passa a ser a célula [c][l], e nada mais muda. A linha de cabeçalho passa a primeira coluna, portanto Name,Q1,Q2,Q3 sobre Alice,10,20,30 e Bob,5,6,7 volta como Name,Alice,Bob, depois Q1,10,5, depois Q2,20,6 e depois Q3,30,7 — quatro linhas, três colunas, e as etiquetas descem agora pela margem esquerda em vez de correrem em cima. As linhas de comprimento desigual são preenchidas, nunca truncadas: a saída tem tantas linhas quantas células tinha a linha de entrada mais larga, e uma linha curta contribui com strings vazias. Com a,b,c sobre 1,2 e 3,4,5,6 obtém quatro linhas de saída, a última das quais é ,,6 — uma linha sem nome que leva o valor que o cabeçalho nunca contemplou. As aspas são refeitas de raiz, portanto uma célula que contenha o delimitador ou uma quebra de linha volta corretamente citada. Não há conversão de tipos nenhuma: 007 continua 007, 1.0 continua 1.0, true continua true, porque a ferramenta só move texto. O delimitador é detetado no primeiro registo e a saída usa o mesmo — um ficheiro com ponto e vírgula transpõe-se num ficheiro com ponto e vírgula. Duas coisas a vigiar. Uma linha em branco dentro da entrada passa a uma coluna inteiramente vazia na saída, porque uma linha em branco é uma linha com uma célula vazia. E transpor não é pivotar: uma tabela em formato longo com uma chave repetida volta com cabeçalhos de coluna duplicados em vez de remodelada, porque rodar uma tabela não agrupa nada.
O que acontece à linha de cabeçalho, às linhas de comprimento desigual, aos tipos — e a única coisa com que transpor é regularmente confundido e que não consegue fazer.
O que acontece à linha de cabeçalho
Nada de especial, e é justamente esse o ponto a compreender antes de usar o resultado. A ferramenta não faz ideia de que a sua primeira linha é um cabeçalho. Lê uma grelha de células, reescreve a mesma grelha com os eixos trocados, e para. Assim, Name,Q1,Q2,Q3 sobre Alice,10,20,30 e Bob,5,6,7 torna-se quatro linhas: Name,Alice,Bob, depois Q1,10,5, depois Q2,20,6 e depois Q3,30,7. As suas etiquetas de coluna são agora a primeira célula de cada linha, e as suas etiquetas de linha — Alice e Bob — são agora o cabeçalho.
A primeiríssima célula da tabela, a que dizia Name, acaba no canto da saída como etiqueta de uma linha de cabeçalho que já não etiqueta nada de útil. É o normal numa tabela transposta e é por isso que quase toda a gente a renomeia depois à mão — de Name para algo como Métrica ou Período, consoante o que agora desce pela esquerda. O importante é que aquilo que ler o ficheiro a seguir continua a achar que a primeira linha é um cabeçalho, e essa primeira linha é agora a lista das suas antigas etiquetas de linha. Se meter o resultado num conversor de CSV para JSON, as suas chaves serão Name, Alice e Bob.
Linhas irregulares: preenche, e nunca trunca
Uma exportação real nem sempre é retangular. Uma linha pode ser curta porque um campo final estava vazio e o escritor parou cedo; uma linha pode ser longa porque um delimitador sem escape partiu um campo em dois. Ambas acontecem, e um transpositor tem de decidir qual é a altura da saída. Este usa a linha mais larga: o número de linhas de saída é igual ao número de células da linha de entrada mais longa, e toda a posição que nenhuma linha de entrada preencheu passa a ser uma string vazia.
A demonstração é curta. Tome o cabeçalho a,b,c sobre as duas linhas 1,2 e 3,4,5,6. A linha mais larga tem quatro células, portanto a saída tem quatro linhas: a,1,3, depois b,2,4, depois c,,5 e depois ,,6. Leia com atenção essa última linha. Leva o valor 6, que é dado real da entrada, e a sua primeira célula está vazia porque o cabeçalho só tinha três nomes. A ferramenta está a dizer-lhe algo verdadeiro e útil — havia um quarto campo numa linha e nada o nomeava — e di-lo deixando uma linha sem nome no fim em vez de apagar a prova. Truncar teria deitado fora exatamente a célula que prova que o seu ficheiro tem um problema de aspas.
Daí decorre um efeito secundário. Transpor duas vezes uma tabela irregular não devolve o original: a primeira passagem tapa os buracos, portanto a segunda reconstrói um retângulo. a,b,c sobre 1,2 e 3,4,5,6 volta como a,b,c, sobre 1,2,, e 3,4,5,6 — os mesmos valores, quatro colunas em toda a parte, vazios finais onde o original era curto. Numa tabela retangular a dupla transposição é exata e devolve o ficheiro de partida, byte a byte, desde que as aspas já fossem mínimas.
Os tipos: a ferramenta não faz nada, e é para aí que o risco se desloca
Não há conversão de tipos em parte alguma desta ferramenta. Analisa as células como texto, move-as e reescreve-as como texto. 007 continua 007, 1.0 continua 1.0, true continua true, e uma data continua a string que era. Nada é arredondado, nada é reinterpretado, e um zero inicial não se pode perder, porque nunca existe número nenhum.
O risco está inteiramente a jusante, e é a transposição que o cria. Antes, cada coluna era homogénea: uma coluna de datas, uma de valores, uma de nomes de região. Depois, cada coluna é uma mistura, porque contém uma célula de cada coluna original. Abra o resultado numa folha de cálculo e a adivinhação de tipos corre coluna a coluna sobre dados que já não têm um tipo por coluna. A etiqueta da primeira célula é texto e o resto são números, portanto uma coluna de números é lida como texto, ou uma célula solta que parece uma data é convertida numa. Não é obra do transpositor, mas é a sua consequência, e é por isso que o conselho prático é transpor numa ferramenta de texto e abrir o resultado com todas as colunas forçadas a texto em vez de deixar a folha de cálculo inferir.
Onde isto aparece, e o único trabalho que não consegue fazer
Três situações explicam quase tudo. Uma série temporal exportada em formato longo, uma linha por período, quando o gráfico que está a construir quer uma coluna por período. Uma exportação de inquérito em que as perguntas são linhas e os inquiridos colunas, ou o contrário, consoante a ferramenta que a escreveu. E um relatório em que alguém montou a tabela dinâmica ao contrário e a enviou, portanto o ficheiro que chega à sua caixa tem os períodos ao lado e as métricas em cima quando tudo o resto do seu circuito espera o contrário. Nos três, o remédio é uma transposição genuína: os dados já têm a forma certa, estão apenas rodados.
Há uma quarta situação que parece idêntica e não é, e é a que custa uma tarde. Uma tabela em formato longo tem uma coluna chave que se repete: Data, Região, Vendas, com duas linhas para janeiro porque há duas regiões. Transpô-la não a remodela. Dê à ferramenta Date,Region,Sales sobre 2026-01,North,120, 2026-01,South,90 e 2026-02,North,140, e a saída são três linhas: Date,2026-01,2026-01,2026-02, depois Region,North,South,North e depois Sales,120,90,140. A primeira linha tem agora um cabeçalho repetido, e a tabela continua longa — uma entrada por observação, apenas escrita de lado. O que queria era um pivot: agrupar por data, espalhar as regiões pelas colunas, e pôr as vendas nas células. Isso é uma agregação, não uma rotação, e exige uma ferramenta que saiba que coluna é a chave, qual é a etiqueta e qual é o valor.
Três comportamentos discretos que vale a pena conhecer
Uma linha em branco dentro da sua entrada passa a ser uma coluna vazia na saída. Não é um erro e decorre diretamente da definição: uma linha em branco é uma linha que contém uma célula vazia, portanto depois da rotação é uma coluna que contém uma célula vazia mais preenchimento. Dê à ferramenta a,b, depois 1,2, depois uma linha em branco e depois 3,4, e obtém a,1,,3 sobre b,2,,4 — a terceira coluna é a linha em branco. Como as pessoas colam dados com linhas em branco a separar blocos mais vezes do que pensam, esta é a surpresa mais frequente que a ferramenta produz. Retire as linhas vazias antes de transpor se não eram intencionais.
O delimitador sai tal como entrou. É detetado no primeiro registo e reutilizado para a saída, portanto um ficheiro com ponto e vírgula transpõe-se num ficheiro com ponto e vírgula e um com tabulações num com tabulações. Não há opção para o mudar pelo caminho — se quiser outro, passe depois o conversor de delimitador. O corolário é que uma deteção errada arruína o resultado em vez de o degradar: force a vírgula num ficheiro que usa mesmo pontos e vírgulas e cada linha passa a ser uma só célula, portanto toda a tabela se transpõe numa única linha.
As aspas são reconstruídas, não copiadas. Cada célula é reexaminada à saída e citada só se agora contiver o delimitador, uma aspa ou uma quebra de linha. Uma célula com y,z estava citada à entrada e volta a estar à saída; uma célula citada sem motivo volta nua. As células com quebras de linha embutidas sobrevivem intactas, continuam citadas e continuam a ocupar duas linhas físicas do ficheiro. Isto significa que a saída é um CSV válido mesmo quando a entrada estava citada mais do que o preciso — e significa também que uma comparação byte a byte de uma dupla transposição divergirá se o original tinha aspas supérfluas.
| Entrada | Saída | O que significa |
|---|---|---|
| Name,Q1,Q2,Q3 / Alice,10,20,30 / Bob,5,6,7 | Name,Alice,Bob / Q1,10,5 / Q2,20,6 / Q3,30,7 | A linha de cabeçalho passa a primeira coluna; as etiquetas de linha passam a cabeçalho |
| a,b,c / 1,2 / 3,4,5,6 | a,1,3 / b,2,4 / c,,5 / ,,6 | Preenche até à linha mais larga e nunca trunca; a última linha fica sem nome porque o cabeçalho era curto |
| a,b,c / 1,2,3 / x,"y,z",w | a,1,x / b,2,"y,z" / c,3,w | As aspas são refeitas de raiz: uma célula com o delimitador é recitada na sua nova posição |
| a,b / 1,2 / (uma linha em branco) / 3,4 | a,1,,3 / b,2,,4 | Uma linha em branco é uma linha com uma célula vazia: depois da rotação é uma coluna vazia |
| Date,Region,Sales / 2026-01,North,120 / 2026-01,South,90 / 2026-02,North,140 | Date,2026-01,2026-01,2026-02 / Region,North,South,North / Sales,120,90,140 | Transpor não é pivotar: a chave repetida produz um cabeçalho repetido e a tabela continua longa |
Perguntas frequentes
- A primeira linha é tratada como cabeçalho?
- Não, e não há opção para dizer que é. A ferramenta lê uma grelha e roda-a; toda a linha é uma linha. É o comportamento desejável, porque um transpositor que tratasse a primeira linha de forma especial teria de decidir o que fazer com ela — mantê-la em cima, o que não seria uma transposição, ou movê-la fingindo que continua cabeçalho, o que seria mentira. A consequência é que depois de transpor vai normalmente querer renomear à mão a primeiríssima célula, porque ela etiqueta agora uma linha de cabeçalho feita das suas antigas etiquetas de linha e não uma coluna de coisa nenhuma.
- Que tamanho de ficheiro posso transpor?
- A área de largada aceita ficheiros até 2 MB, e tudo corre no seu navegador e não num servidor, portanto nada é enviado. O limite real de uma transposição não é o tamanho mas a forma: transpor converte linhas em colunas, portanto um ficheiro de 50 000 linhas passa a ser um ficheiro de 50 000 colunas. É CSV válido e a ferramenta vai produzi-lo, mas muito poucos programas o abrem com conforto — os limites de colunas das folhas de cálculo estão nas dezenas de milhares, e um editor de texto dar-lhe-á uma linha com vários megabytes de largura. Se a sua tabela é alta e não larga, pergunte-se se quer mesmo uma transposição, ou se o que precisa é de um pivot que agrupe as linhas em meia dúzia de colunas.
- Porque é que o meu ficheiro transposto tem uma coluna cheia de nada?
- Quase de certeza porque a entrada tinha uma linha em branco onde essa coluna está agora. Uma linha em branco é analisada como uma linha que contém uma célula vazia, e depois da rotação essa linha é uma coluna. Conte a partir da esquerda: a posição da coluna vazia corresponde à posição da linha em branco a contar de cima. O mesmo acontece com uma linha que só tem delimitadores, como ,,, que são quatro células vazias e não uma linha em branco mas dá o mesmo resultado à vista. Retire primeiro as linhas vazias da sua entrada — uma quebra de linha final no fim do ficheiro é tratada e não causa isto, mas uma linha em branco no meio causa.
- Posso transpor só uma parte do ficheiro?
- Num só passo não: o transpositor pega em toda a entrada. A via prática é cortar primeiro e transpor depois. Cole só o bloco que quer, ou tire as colunas que lhe interessam com um extrator de colunas e transponha o resultado, que aliás costuma ser o que queria de qualquer modo: uma tabela larga transposta por inteiro é ilegível, ao passo que quatro colunas escolhidas transpostas em quatro linhas são um resumo que cabe numa mensagem. Se o ficheiro tiver vários blocos separados por linhas em branco, lembre-se de que essas linhas se tornam colunas vazias, portanto separe os blocos em entradas distintas em vez de os transpor todos juntos.
- Preciso de uma coluna por mês a partir de uma tabela com uma linha por mês. Isso é uma transposição?
- Depende de uma só coisa: se o mês aparece mais do que uma vez. Se cada mês tiver exatamente uma linha, então sim — a tabela já tem a forma certa e rodá-la dá-lhe o que quer. Se um mês aparecer várias vezes porque há uma segunda dimensão na tabela, como uma região ou um produto, então não. Rodar isso dá-lhe etiquetas de mês repetidas em cima e deixa-o tão longe da resposta como estava. O que precisa aí é de um pivot: escolher a chave que passa a ser as linhas, a etiqueta cujos valores distintos passam a ser as colunas, e o valor que aterra nas células, e decidir o que acontece quando duas linhas de origem caem na mesma célula — somá-las, calcular a média, ou recusar. Um transpositor não tem nenhuma dessas três entradas e não as pode pedir.
Artigos que podem interessar-lhe
Todos os guias →Ferramentas relacionadas
Isto descreve o que estes conversores fazem hoje, verificado executando-os, e não o que uma norma obrigue um conversor a fazer. O CSV não tem norma prescritiva: o RFC 4180 é informativo e descreve uma prática corrente, pelo que duas ferramentas aparentemente corretas podem divergir sobre o mesmo ficheiro sem que nenhuma esteja errada. O achatamento, a deteção de tipos e a de arrays são convenções, não regras. Antes de converter dados que não possa reexportar, passe primeiro por uma cópia e compare o número de linhas e colunas nas duas pontas.
Fontes
- IETF — RFC 4180, Common Format and MIME Type for Comma-Separated Values (CSV) Files — section 2 rule 4 on each record containing the same number of fields, and rule 6 on quoting a field that holds a delimiter or a line break
- W3C — Model for Tabular Data and Metadata on the Web — the abstract model of a table as rows and columns of cells, and the annotations that a bare CSV file cannot carry
- Journal of Statistical Software — Hadley Wickham, Tidy Data, volume 59 issue 10, 2014 — the distinction between long and wide layouts and why reshaping between them is a grouping operation rather than a rotation (open access)
- pandas — User guide, Reshaping and pivot tables — pivot, pivot_table and melt, and the aggregation function a pivot needs when two source rows fall into the same cell
Detetaste um erro neste artigo?