2011-01-20 9 views
7

Voglio creare un elenco separato da virgole in modo da poter suddividere la virgola in un secondo momento per ottenere un array di valori. Tuttavia, i valori potrebbero contenere delle virgole. In effetti, possono avere qualsiasi carattere di tastiera normale in loro (sono forniti da un utente). Qual è una buona strategia per determinare un personaggio che sicuramente non entrerà in collisione con i valori?Divisione su un carattere univoco

Nel caso in cui ciò sia importante in un modo dipendente dalla lingua, sto costruendo l'elenco separato "alcuni caratteri" in C# e inviandolo a un browser per essere diviso in javascript.

+4

Forse ripensare il problema e invia i dati in xml o json invece di fare affidamento su uno o più caratteri che speri che l'utente non fornisca come input o che non possa altrimenti far parte di dati validi. –

+0

Sono d'accordo con Anthony, c'è pieno supporto sul server e sul client per l'utilizzo di questi approcci. Se c'è un requisito reale per l'emissione di csv/dsv, potrebbe essere comunque meno problematico esportare i dati in un secondo momento. –

risposta

1

È possibile dividerlo con un carattere nullo e terminare l'elenco con un carattere doppio nullo.

+0

questa è una bella idea, mi piace. –

0

Uso sempre | ma se pensi ancora che possa contenerlo, puoi usare combinazioni come @ | @. Ad esempio:

"string [email protected]|@string [email protected]|@[email protected]|@last string" 
+0

Il punto è che gli utenti possono sempre digitare tali caratteri. Utilizzando un carattere null come suggerisce gamernb, puoi evitare questo problema. Un carattere nullo, tuttavia, non può essere valido in ogni formato di file. È possibile sfuggire alla stringa originale e utilizzare un altro carattere di divisione per evitare questo problema. – Ruud

+0

Ho pensato anche a questo, ma mi sono perso il fatto che il formato di output fosse consumato da JS. Se i dati vengono esportati come file, hai ragione. –

3

Se JavaScript sta consumando l'elenco, perché non inviarlo sotto forma di un array JavaScript? Ha già un metodo consolidato e affidabile per rappresentare un elenco e caratteri di escape.

["Value 1", "Value 2", "Escaped \"Quotes\"", "Escaped \\ Backslash"] 
0

Eric S. Raymond ha scritto un capitolo su questo libro che potresti trovare useful. È diretto agli utenti di Unix ma dovrebbe comunque essere applicato.

Per quanto riguarda la tua domanda, se avrai virgole all'interno delle celle, avrai bisogno di una qualche forma di fuga. L'utilizzo di \, è un metodo standard, ma dovrai anche evitare le barre, che sono anche comuni.

In alternativa, utilizzare un altro carattere come il tubo (|), la scheda o qualcos'altro di propria scelta. Se gli utenti devono lavorare con i dati utilizzando un programma per fogli di calcolo, di solito puoi aggiungere regole di filtro alle celle divise sul delimitatore di tua scelta. Se questo è un problema, è probabilmente meglio scegliere un delimitatore che gli utenti possano facilmente digitare, il che esclude il nul char, tra gli altri.

Si potrebbe anche usare citando:

"value1", "value2", "etc" 

In questo caso, si avrà solo bisogno di fuggire citazioni (e barre). Questo dovrebbe essere accettato anche dai fogli di calcolo dati le opzioni di filtro corrette.

0

Se è possibile che compaia un carattere di suddivisione nelle stringhe, suggerirei di scrivere un elemento di script nel proprio output con una definizione di array javascript. Per esempio:

<script> 
var myVars=new Array(); 
myVars[0]="abc|@123$"; 
myVars[1]="123*456"; 
myVars[2]="blah|blah"; 
</script> 

Javascript può quindi fare riferimento a tale matrice

In questo modo si evita anche la necessità di creare una stringa separati da virgola dal C# array di stringhe.

L'unico risultato che posso pensare sono stringhe che contengono citazioni, in questo caso dovresti scapparle in C# quando le scrivi nell'output di myVars.

0

Ci sono diversi modi per farlo. Il primo è selezionare un carattere separatore che normalmente non verrebbe inserito dalla tastiera. NULL o TAB sono normalmente buoni. Il secondo è utilizzare una sequenza di caratteri come separatore, i file CSV di Excel sono un buon esempio in cui i valori delle celle sono definiti da virgolette con virgole che separano le celle.
La risposta dipende se si desidera reinventare la ruota o meno.

0

C'è un RFC which documents the CSV format. Seguire gli standard e si eviterà di reinventare la ruota e creare un pasticcio per il prossimo ragazzo a venire e mantenere il vostro codice. La cosa bella è che ci sono librerie disponibili per importare/esportare CSV per quasi tutte le piattaforme che puoi immaginare.

Detto questo, se si sta serializzazione dati da inviare a un browser, JSON è davvero la strada da percorrere e anch'essa è documented in an RFC e si può ottenere librerie per quasi ogni piattaforma come JSON.NET