Ir para o conteúdo
OneKitly

Transpor uma tabela cujas linhas deviam ter sido colunas

Publicado a 22/07/2026 · 13 min de leitura · Ferramentas para programadores

Daniel Okonkwo

Daniel OkonkwoProgramador front-end e redator de Tecnologia na OneKitly

Desempenho web · Formatos de ficheiro

Verificado a partir de 4 fontes

Ver perfil
Em resumo

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.

Cinco entradas e a saída exata que o transpositor devolveu para cada uma
EntradaSaídaO que significa
Name,Q1,Q2,Q3 / Alice,10,20,30 / Bob,5,6,7Name,Alice,Bob / Q1,10,5 / Q2,20,6 / Q3,30,7A linha de cabeçalho passa a primeira coluna; as etiquetas de linha passam a cabeçalho
a,b,c / 1,2 / 3,4,5,6a,1,3 / b,2,4 / c,,5 / ,,6Preenche 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",wa,1,x / b,2,"y,z" / c,3,wAs 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,4a,1,,3 / b,2,,4Uma 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,140Date,2026-01,2026-01,2026-02 / Region,North,South,North / Sales,120,90,140Transpor não é pivotar: a chave repetida produz um cabeçalho repetido e a tabela continua longa
Transpor CSVTroque as linhas e colunas de dados delimitados. Cole o texto ou largue o ficheiro; em nenhum dos casos algo sai da página.Experimentar a ferramenta

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
TutorialConstruir uma tabela Markdown de raiz, sem contar travessões à mãoA coisa mais pequena que ainda é uma tabela são duas linhas: uma linha de cabeçalho e uma linha delimitadora. Aqui está porque é que a segunda é obrigatória em GitHub Flavored Markdown, onde as tabelas de barras não existem de todo, e o que um gerador faz que escrever à mão não consegue.GuiaColar uma tabela num pull request: o que parte, e os dois carateres que partem tudoUma tabela Markdown proíbe exatamente dois carateres dentro de uma célula: a barra vertical e a quebra de linha. Aqui está o que cada um faz, como um conversor os trata, porque é que o escape tem de ser aplicado na ordem certa, e porque é que o alinhamento da fonte nunca conta.ExplicaçãoDe CSV para JSON: os cinco casos que partem qualquer conversorDelimitadores entre aspas, quebras de linha embutidas, tipos ambíguos, cabeçalhos repetidos e codificação. Cada caso passou pelo conversor e a saída exata está aqui — incluindo os dois que ele não salva.ExplicaçãoPonto e vírgula, tabulação, barra: escolher um delimitador que sobreviva à viagemPorque é a língua de quem lê que decide o delimitador, o que o conversor faz às aspas quando muda, o que é realmente a primeira linha sep=, e a contagem de células citadas na mesma exportação escrita de cinco maneiras.ExplicaçãoDe JSON para CSV quando a estrutura é aninhada: porque não há resposta certaAs mesmas duas encomendas saem com cinco colunas de um conversor e dez de outro, e nenhum está errado. Caminhos com pontos, arrays de escalares, arrays de objetos e registos com chaves diferentes: quatro decisões, tomadas por si e quase sempre em silêncio.TutorialComo converter JSON para CSV: achatar arrays de objetos em linhas e colunasUm guia prático para transformar um array JSON de objetos num ficheiro CSV limpo, incluindo o achatamento de campos aninhados e os casos-limite.

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

Detetaste um erro neste artigo?