Stringa delimitata "divisa", preservando le voci vuote


10

Sto cercando di utilizzare le funzioni SPLITe JOINin Fogli Google (la nuova versione) per manipolare alcuni dati e sto riscontrando problemi perché SPLITnon si conservano voci vuote.

L'origine dati è impostata in questo modo, essenzialmente:

   |  A    B    C    D
-----------------------
1  |  q    5    r    2
2  |  s         t    4
3  |  u    8    v
4  |  w    3    x    6

(Le voci vuote in questo set di dati rappresentano "nessuna misurazione", che è distinta da una misurazione di 0)

Sulle colonne Ae C, sto ottenendo il risultato desiderato usando la formula:

=SPLIT(JOIN("~",A1:A4,C1:C4),"~")

Ciò produce una riga che va, come previsto q s u w r t v x, ciascuno nella propria cella.

Tuttavia, questo metodo non funziona su colonne Be D. JOINfunziona come previsto, fornendo l'output:

5~~8~3~2~4~~6

L'esecuzione SPLITsu quell'output, tuttavia, comporta un problema: rimango con 5 8 3 2 4 6, senza celle vuote tra 5e 8o tra 4e 6, il che significa che le coppie sono suddivise (ad esempio se vdovrebbero corrispondere a celle vuote, ma invece we lo xfanno). Il problema sembra essere l' SPLITinterpretazione ~~come un delimitatore singolo, anziché come due delimitatori con una voce nulla tra di loro.

Qualcuno sa come conservare le voci vuote in questo tipo di scenario?

L'output desiderato sarebbe simile a questo

q  s  u  w  r  t  v  x
5     8  3  2  4     6

Uno spazio in quei campi vuoti risolverebbe il problema?
Ale

La digitazione di "" comporta la conservazione della voce vuota (grazie, @AlE.!), Ma sarebbe comunque preferibile avere una soluzione tecnologica, anche perché la digitazione manuale di "" in tutte quelle voci richiederebbe molto tempo e soggetto a errore.
LiberalArtist,

Le formule del foglio di calcolo non sono il mio punto di forza. Forse si può fare qualcosa IF()per convertire automaticamente i campi vuoti in spazi.
Ale

1
Aggiornamento: L'idea di @AlE. mi ha permesso di ottenere il calcolo fatto nel termine immediato usando =ARRAYFORMULA(IF(ISBLANK(B1:B4)," ",B1:B4))per creare un set fittizio di colonne con "" nelle celle vuote, che poi vengono utilizzate per SPLITe JOIN. Spero ancora che qualcuno abbia una soluzione più elegante, però: questo aggiunge un sacco di cose extra al mio documento, e ha ancora bisogno che io aggiorni i numeri di riga in alcuni punti diversi man mano che vengono aggiunte più misurazioni al set di dati. (Grazie ad AI E. almeno per avermi permesso di sgretolare i dati per ora!)
LiberalArtist,

Risposte:


3

Prova la seguente soluzione.

Formula

=ARRAYFORMULA(TRIM(SPLIT(JOIN(" ,", A1:A4,C1:C4), ",")))

spiegato

È già ci ha mostrato che la SPLITfunzione di ignora le celle vuote, quindi ho scelto questa stringa come delimitatore: " ,". Il risultato intermedio della JOINfunzione è simile al seguente:
inserisci qui la descrizione dell'immagine

Ho scelto il delimitatore per la SPLITfunzione sia questo: ",". Il risultato intermedio della SPLITfunzione è simile al seguente:
inserisci qui la descrizione dell'immagine

Ora, tuttavia, dobbiamo occuparci degli spazi bianchi aggiunti extra. Pertanto ho usato la TRIMfunzione per rimuovere tutti gli spazi bianchi finali o iniziali (in combinazione con ARRAYFORMULA). Confronta i LENvalori di ciascun risultato intermedio.

Risultato

inserisci qui la descrizione dell'immagine

Esempio

Ho creato un file di esempio per te: SPLIT per preservare le celle vuote


2

Prova la seguente soluzione.

Codice

function myJoin() { 
  var output = []; 
  for(var i = 0, iLen = arguments.length; i < iLen; i++) {
    for(var r = 0, rLen = arguments[i].length; r < rLen; r++) {
      output.push(arguments[i][r][0]);
    }    
  }
  return [output];
}

uso

inserisci qui la descrizione dell'immagine

Aggiungi tutti gli intervalli alla funzione che desideri e verranno elaborati. Aggiungi questo piccolo script nell'editor di script del tuo foglio di calcolo (Strumenti> Editor di script; premi il pulsante Salva).

Esempio

Ho creato un file di esempio per te: SPLIT per preservare le celle vuote


2

Risposta breve

La seguente formula restituisce il risultato desiderato.

=Transpose({A1:B4;C1:D4})

Risposta estesa

Questa risposta è focalizzata nel fornire un modo per ottenere il risultato desiderato invece di discutere su come far funzionare l'approccio scelto.

Il problema XY

L'OP vuole ottenere X e pensa che Y dovrebbe restituire quel risultato. Questo approccio è problematico perché Y ha alcuni avvertimenti. Questo potrebbe essere un grave problema poiché l'OP chiede come far funzionare Y invece di chiedere un modo per ottenere X ma non è così grande perché fornisce il contesto e il risultato desiderato.

Soluzione

Fogli Google è in grado di gestire risultati multi-valore in modo molto semplice dal punto di vista degli utenti finali. D'altra parte, consente di utilizzare una notazione speciale per consentire agli utenti finali di definire array.

Le funzionalità di cui sopra rendono possibile ottenere il risultato atteso senza l'uso delle funzioni SPLIT () e JOIN () e senza le avvertenze inerenti ad esse.

Spiegazione della formula

{A1:B4;C1:D4}

È un array 2 X 8 composto da due array / intervalli 2 X 4. Il punto e virgola ( ;) viene utilizzato presupponendo che il separatore decimale del foglio di calcolo sia un punto ( .). Se il separatore decimale era una virgola, sostituirlo con una barra rovesciata ( \).

=Transpose({A1:B4;C1:D4})

Converte l'array 2 X 8 in un array 8 X 2.

Uno dei vantaggi di questo metodo è che non richiede una gestione speciale delle celle vuote. Altri vantaggi sono che è una formula molto compatta ed è molto facile da adattare.

Riferimenti


1

Se ti unisci e rendi il delimitatore "," sostanzialmente una virgola con uno spazio precedente, lo spazio verrà automaticamente preservato quando lo dividi di nuovo:

=SPLIT(JOIN(" ,",A1:A4),",")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.