Vai al contenuto
Allin

Pulire un elenco incollato da un foglio di calcolo o da un PDF

Pubblicato il 06/08/2026 · 12 min di lettura · Strumenti testo e lingua

Daniel Okonkwo

Daniel OkonkwoSviluppatore front-end e redattore Tech presso Allin

Performance web · Formati di file

Verificato su 4 fonti

Vedi il profilo
In breve

Esegui prima trim-lines, poi remove-blank-lines. L'ordine conta perché remove-blank-lines decide cosa è vuoto con il .trim() di JavaScript, che tratta effettivamente U+00A0 (spazio unificatore) come spazio, ma non tocca il testo delle righe che conserva: una riga «Lyon » sopravvive con i suoi tre spazi finali intatti. trim-lines usa lo stesso .trim() e pulisce entrambe le estremità di ogni riga, compreso un ritorno a capo isolato. Insieme coprono spazi, tabulazioni, spazi unificatori, spazi sottili e il segnalibro di ordine dei byte. Due caratteri sfuggono a entrambi: U+00AD, il trattino morbido che un PDF inserisce dove ha spezzato una parola a fine riga, e U+200B, lo spazio a larghezza zero. Nessuno dei due è spazio per JavaScript, quindi attraversano remove-blank-lines, trim-lines, trailing-whitespace-remover e remove-whitespace senza modifiche. Sorveglia soprattutto trailing-whitespace-remover: riconosce solo lo spazio ASCII e la tabulazione, perciò sulla stringa «x» seguita da uno spazio unificatore non cambia nulla, e su «x» + unificatore + spazio normale toglie quello normale e lascia l'unificatore. Tutti e quattro riscrivono anche in silenzio i fine riga CRLF in semplici avanzamenti, cosa di solito voluta, e nessuno considera interruzione di riga un ritorno a capo isolato. Un incolla da un foglio di calcolo porta inoltre tabulazioni fra le celle di una riga: remove-whitespace con le impostazioni predefinite cancellerà quelle tabulazioni e incollerà le tue colonne una all'altra.

Un incolla porta con sé caratteri invisibili: spazi unificatori, trattini morbidi, spazi a larghezza zero, tabulazioni e CRLF. Quattro strumenti di pulizia sono stati eseguiti su ciascuno, e usano tre definizioni diverse di spazio.

Cosa arriva davvero negli appunti

Il testo che vedi sullo schermo e il testo negli appunti non sono lo stesso oggetto. Un PDF non ha righe né paragrafi: ha riquadri di glifi a delle coordinate. Quando selezioni una colonna di testo e la copi, il lettore ricostruisce un ordine di lettura plausibile e inserisce un'interruzione di riga alla fine di ogni riquadro, così una frase che occupava tre righe stampate arriva come tre righe. Se il compositore ha spezzato una parola a una di quelle fini riga, alcuni produttori scrivono un trattino vero e altri U+00AD, il trattino morbido, che si disegna come trattino solo se lì cade una divisione e come nulla altrimenti. E poiché la maggior parte dei PDF europei è composta con spazi unificatori prima dei due punti, dei punti e virgola e delle unità, un documento francese o italiano ti consegna U+00A0 dove giureresti ci siano spazi ordinari.

Un incolla da un foglio di calcolo è più ordinato, ma non pulito. Excel, Numbers e Google Sheets mettono tutti una tabulazione fra le celle di una riga e un'interruzione di riga fra le righe, e su Windows quell'interruzione è un CRLF: un ritorno a capo seguito da un avanzamento riga, due caratteri dove ne vedi uno. Cancella un blocco di righe in mezzo a una selezione e spesso copi anche le righe vuote, che arrivano come righe contenenti solo tabulazioni. È esattamente la forma per cui gli strumenti di questa pagina sono fatti: un elenco in cui le righe utili sono separate da righe che contengono solo caratteri invisibili, e in cui alcune righe utili portano caratteri invisibili propri a un'estremità o a entrambe.

Quattro strumenti, tre definizioni di spazio

remove-blank-lines e trim-lines chiamano entrambi il .trim() di JavaScript. Il linguaggio definisce ciò che rimuove come WhiteSpace più LineTerminator, e WhiteSpace comprende ogni carattere della categoria Unicode Space_Separator — dove abitano U+00A0, U+2009 (spazio sottile) e U+202F (spazio sottile unificatore) — oltre al segnalibro di ordine dei byte U+FEFF. Metti ciascuno di quei caratteri da solo su una riga e passalo in remove-blank-lines: la riga sparisce. remove-whitespace usa la classe di espressione regolare \s, che designa lo stesso insieme. Tre strumenti su quattro sono dunque d'accordo sullo spazio unificatore, e d'accordo con ciò che si aspetterebbe chi legge.

trailing-whitespace-remover no. Il suo schema è una sequenza di spazi ASCII o tabulazioni ancorata a fine riga, e nient'altro conta. Nutrito con la stringa x seguita da uno spazio unificatore, restituisce la stringa immutata. Nutrito con x seguito da un unificatore e poi da uno spazio ordinario, toglie l'ordinario e restituisce x più l'unificatore: visivamente non più corto di nulla, e sempre diverso da x. Non è una differenza estetica. Se pulisci un elenco prima di deduplicarlo, è proprio quello spazio unificatore superstite a tenere separati due nomi di città identici.

I due caratteri che nessuno di questi strumenti rimuove

U+00AD, il trattino morbido, e U+200B, lo spazio a larghezza zero, non sono spazi per JavaScript. La classe di espressione regolare \s non li riconosce e .trim() non li rimuove: verificato direttamente, non supposto. Una riga che contiene solo un trattino morbido sopravvive quindi a remove-blank-lines e sembra, nel riquadro di uscita, esattamente una riga vuota che lo strumento si è rifiutato di cancellare. La parola «cooperative» copiata da un PDF con sillabazione, con un trattino morbido fra «co» e «operative», esce identica da tutti e quattro gli strumenti — e non corrisponderà mai alla stringa «cooperative» in nessuna ricerca tu faccia dopo.

C'è un solo strumento su questo sito che davvero li cancella, e lo scambio è pessimo per cinque delle nostre sei lingue. remove-non-ascii toglie ogni carattere sopra U+007F, e questo porta via davvero il trattino morbido, lo spazio a larghezza zero, lo spazio unificatore e il segnalibro di ordine dei byte. Porta via anche, senz'altro, ogni lettera accentata invece di ripiegarla: la frase «Les coopératives régionales», passata con un trattino morbido dentro la prima parola, è uscita «Les coopratives rgionales» — la e accentata semplicemente sparita, non sostituita da una senza accento. La strada onesta è find-and-replace con il carattere colpevole incollato nel campo «Trova», che funziona perché quello strumento fa l'escape del termine di ricerca e lo confronta alla lettera. Resta da procurarsi un esemplare di un carattere invisibile, cosa esattamente scomoda quanto sembra.

Fine riga, e l'unica interruzione che questi strumenti non vedono

Tutti e quattro gli strumenti dividono su un avanzamento riga preceduto da un ritorno a capo facoltativo, poi riuniscono il risultato con semplici avanzamenti. Ciò significa che ognuno di essi normalizza i fine riga CRLF di Windows in avanzamenti Unix come effetto collaterale, qualunque altra cosa tu abbia chiesto: incolla un blocco di foglio di calcolo, esegui remove-blank-lines, e l'uscita è più corta di un byte per riga anche se nessuna riga è stata rimossa. È quasi sempre ciò che volevi, ma vale la pena sapere che è successo, perché un file che poi deve tornare in uno strumento Windows potrebbe aver bisogno che gli si restituiscano i fine riga.

L'interruzione che non vedono è un ritorno a capo isolato senza avanzamento riga dietro — il fine riga del Mac OS classico fino al 2001, e quello che alcune vecchie routine di esportazione e certi dump di database emettono ancora. Davanti ai tre caratteri a, ritorno a capo, ritorno a capo, b, tutti e quattro gli strumenti trattano il tutto come una sola riga e la restituiscono intatta. Nulla ti avverte. Se un incolla torna come un'unica riga enorme senza interruzioni visibili e senza errori, è la prima cosa da sospettare, e il rimedio è aprire il file in un editor capace di convertire i fine riga prima di portarlo qui.

L'ordine in cui incatenarli

prima trim-lines, poi remove-blank-lines. L'ordine inverso dà lo stesso risultato sulla maggior parte degli input, perché remove-blank-lines prova già ogni riga con .trim() prima di decidere: una riga di tre spazi cade che tu abbia tagliato prima o no. Verificato sull'input disordinato «due spazi, alpha, due spazi», poi una riga di sola tabulazione, poi «due spazi, beta, uno spazio», poi una riga vuota, poi «alpha»: entrambi gli ordini hanno prodotto alpha, beta, alpha. Il motivo per mettere comunque trim-lines per primo è ciò che viene dopo. Dai lo stesso input a duplicate-line-finder senza averlo tagliato e non segnala alcun duplicato, perché il primo alpha porta due spazi davanti e due dietro. Dagli la versione tagliata e segnala alpha.

Due cose da non fare. Non ricorrere a remove-whitespace su un incolla da foglio di calcolo se non hai deciso che le colonne possono sparire: con l'impostazione predefinita cancella ogni spazio, tabulazione e interruzione di riga, e la riga di intestazione «Nom, tabulazione, Ville, tabulazione, CA» è uscita «NomVilleCA». Attivare «mantieni le interruzioni di riga» conserva le righe ma mangia comunque le tabulazioni, quindi le colonne restano incollate. E non eseguire trailing-whitespace-remover sperando che renda due righe confrontabili: toglie lo spazio ASCII e la tabulazione, e nient'altro, che era tutto il punto della seconda sezione. Quando l'obiettivo è il confronto e non l'ordine, è trim-lines a chiudere il divario.

Una riga di input, passata in ciascuno dei quattro strumenti, con l'output realmente prodotto
InputCosa succedePerché
Una riga di tre spazi ordinari, in remove-blank-linesRimossaIl test è riga.trim().length > 0, e .trim() la svuota
Una riga contenente solo U+00A0, in remove-blank-linesRimossaIl WhiteSpace di ECMAScript copre tutta la categoria Space_Separator
Una riga contenente solo U+00AD, in remove-blank-linesConservata, e sembra vuota nell'outputIl trattino morbido è di categoria Cf, un carattere di formattazione, non uno spazio
x seguito da un U+00A0, in trailing-whitespace-removerRestituito immutatoIl suo schema è una sequenza di spazi ASCII o tabulazioni a fine riga, niente di più ampio
x, poi U+00A0, poi uno spazio ordinario, in trailing-whitespace-removerTorna come x seguito da U+00A0La sequenza di spazi ASCII si ferma al primo carattere fuori dalla classe
Lo stesso x più U+00A0, in trim-linesTorna come xLo stesso .trim() di remove-blank-lines, applicato al testo invece che al test
La riga di intestazione Nom, tabulazione, Ville, tabulazione, CA, in remove-whitespaceNomVilleCA — le colonne sono spariteUna tabulazione è spazio, e «mantieni le interruzioni di riga» risparmia solo l'avanzamento riga
a, ritorno a capo, ritorno a capo, b — in uno qualsiasi dei quattroTrattato come una sola riga, restituito intattoDividono tutti su un avanzamento riga preceduto da un ritorno a capo facoltativo
Rimuovi righe vuoteElimina tutte le righe vuote o composte solo da spazi.Prova lo strumento

Domande frequenti

Perché il mio elenco ha ancora righe apparentemente vuote dopo remove-blank-lines?
Quasi certamente uno spazio a larghezza zero (U+200B) o un trattino morbido (U+00AD) da solo sulla riga. Nessuno dei due è spazio per JavaScript, quindi il test dello strumento — resta qualcosa dopo .trim()? — risponde di sì e la riga rimane. Entrambi sono stati passati nello strumento per confermarlo. Uno spazio unificatore o uno spazio sottile da soli sarebbero stati rimossi, quindi la riga superstite non è uno di quelli. Per identificare il carattere senza indovinare, incolla la riga in un contatore di caratteri o di byte e verifica che il conteggio sia uno e non zero.
Allora trailing-whitespace-remover è rotto?
Fa quello che dice la sua stessa descrizione — rimuovere spazi e tabulazioni finali — e quella definizione stretta è quella giusta per il suo lavoro abituale: ripulire la sporcizia invisibile a fine riga nel codice sorgente prima di un commit. Gli strumenti di diff e i linter si occupano di spazio ASCII e tabulazione; uno spazio unificatore dentro il codice è un bug che vuoi vedere, non uno che vuoi cancellato in silenzio. L'unico problema è che il nome si legge come una promessa generale. Per la prosa e per elenchi incollati da documenti, trim-lines è lo strumento con la definizione ampia, ed è quello da usare quando due righe devono poi confrontarsi uguali.
Come mi libero dei trattini morbidi che un PDF ha messo nel mio testo?
Nessuno dei quattro strumenti di questo articolo lo farà. find-and-replace sì, se riesci a mettere un trattino morbido nel suo campo «Trova»: lo strumento fa l'escape di ciò che digiti e lo confronta alla lettera, cosa verificata, quindi incollare il carattere funziona e digitarne una descrizione no. Procurarsi un esemplare di un carattere invisibile passa di solito dal selezionare uno spazio sospettosamente largo nel testo di partenza con le frecce e Maiusc, e copiarlo. Anche remove-non-ascii li rimuove, ma si porta via ogni lettera accentata senza sostituirla: su testo francese, spagnolo, portoghese, tedesco o italiano distrugge più di quanto ripari.
Qualcosa di tutto ciò invia il mio elenco a un server?
No. Tutte e quattro le trasformazioni sono normali operazioni su stringhe che girano nella pagina che hai aperta, sul testo nel riquadro, e producono l'output nella stessa pagina. Nulla nella natura del lavoro richiede un server: dividere sulle interruzioni di riga e provare ogni riga sono poche righe di codice, e non c'è dizionario né modello da consultare. Qui conta più del solito, perché gli elenchi puliti così vengono spesso da documenti interni — nomi di clienti, riferimenti d'ordine, organici — e incollarne uno in uno strumento che lo carica è una decisione di trasferimento dati, non di formattazione.
Il mio incolla da foglio di calcolo tiene le tabulazioni. Come ottengo un elemento per riga?
Nessuno dei quattro lo fa, e remove-whitespace fa anzi il contrario: cancella le tabulazioni e salda insieme le celle, come verificato su una riga di intestazione a tre colonne tornata come una sola parola. Se volevi solo una colonna, copia una sola colonna dal foglio: l'incolla non conterrà alcuna tabulazione e remove-blank-lines più trim-lines sono tutto il lavoro. Se hai più colonne e le vuoi impilate una per riga, è un'altra operazione con il suo strumento, e la risposta onesta è che questi quattro puliscono righe, non spezzano colonne.

Articoli che potrebbero interessarti

Tutte le guide
SpiegazioneTrovare i duplicati di un elenco senza foglio di calcoloDue righe che sembrano identiche spesso non lo sono. Le maiuscole, uno spazio finale, uno spazio unificatore e due codifiche diverse della stessa lettera accentata sono stati passati nel rilevatore di duplicati, che in tre casi su quattro non ne ha segnalato nessuno.TutorialFiltrare righe secondo uno schema, senza riga di comandoQuesto è grep per chi non usa grep, con una differenza importante: la ricerca è una sottostringa letterale, quindi una vera espressione regolare restituisce un riquadro vuoto e nessun errore. Ogni affermazione è stata verificata eseguendo lo strumento.TutorialPulire un testo disordinato: l'ordine delle operazioni che conta davveroTogliere i tag prima di decodificare le entità, ripulire i bordi prima di deduplicare, comprimere gli spazi per ultimo. Tre ordini eseguiti in Node, una pipeline di nove passaggi nella sequenza giusta e i caratteri invisibili — U+00A0, U+200B, U+FEFF — che sopravvivono a ogni pulizia ingenua.GuidaConvertire fra formati di elenco senza perdere dati: le regole di virgolettatura che nessuno leggeTrasformare un elenco a capo in un elenco a virgole è banale finché un elemento non contiene una virgola. Le regole di virgolettatura della RFC 4180, perché un campo CSV può contenere un a capo, perché i fogli di calcolo europei usano il punto e virgola, e cosa fa un elemento vuoto all'andata e ritorno — ogni caso eseguito e stampato.SpiegazioneRilevare la lingua di un testo, e perché i testi brevi fallisconoMisurato, non affermato: 90 frasi brevi reali in sei lingue, nessuna rifiutata e 68 giuste — il 76%, che scende al 64% sotto le sedici lettere. Quattro delle risposte sbagliate sono tornate con il 100% di fiducia.TutorialNumerare le righe di un testo per una revisione a più maniLa numerazione parte da 1 e non si può impostare a 0, l'allineamento usa spazi e non zeri, e lo strumento che li toglie annulla otto degli undici separatori senza toccare l'indentazione. Quello che ancora non sa fare è distinguere i tuoi numeri dai suoi.

Strumenti correlati

Tutto quanto segue descrive ciò che questi strumenti fanno oggi, verificato eseguendo le loro stesse trasformazioni sugli input esatti riportati in ogni articolo, e non ciò che una norma imponga a uno strumento di testo. Il trattamento del testo riga per riga non ha un'autorità unica: cosa conta come spazio, se due righe accentate siano o no la stessa riga, e dove finisca un URL dentro una frase sono decisi in modo diverso da ogni programma in cui incollerai del testo. Quando uno strumento sbaglia un caso, lo si dice apertamente invece di aggirarlo. Prima di passare qualsiasi cosa di questo su un elenco che non potrai riesportare, passa su una copia e confronta il numero di righe alle due estremità.

Fonti

Hai notato un errore in questo articolo?