Non offrirei questa risposta se non per il fatto che hai lavorato così duramente per documentarla ed è stata votata senza risposta dopo un mese. Quindi, ecco qui. Le tue uniche scelte sembrano essere cambiare i dati o cambiare lo strumento.
Quando lo strumento è rotto e al venditore non importa, è un errore continuare a provare. È ora di cambiare. Hai fatto molti sforzi per ricercare esattamente come si è rotto e dimostrare che viola non solo l'RFC ma la versione precedente dello strumento. Di quante prove hai bisogno?
CSV è anche un'ancora per barche. Se hai la possibilità, è meglio usare un normale formato di file delimitato. Per molte applicazioni, i valori delimitati da tabulazioni vanno bene. Il miglior delimitatore IMO è '\' perché quel carattere non ha posto nel testo inglese. (D'altra parte non funzionerà per i dati contenenti percorsi di Windows.)
CSV ha due problemi come formato di scambio. Primo, non è tutto quello standard; applicazioni diverse riconoscono versioni diverse, qualunque cosa possa dire la RFC. Il secondo (e correlato) è che non costituisce una lingua normale in termini CS, motivo per cui non può essere analizzato come un'espressione regolare. Confronta con ^([^\t]*\t)*[\t]*$
per una riga delimitata da tabulazioni. L'implicazione pratica della complessità della definizione di CSV è (vedi sopra) la relativa scarsità di strumenti per gestirli e la loro tendenza ad essere incompatibili, in particolare durante le ore piccole.
Se dai l'avvio a CSV e DTS, hai buone opzioni, una delle quali è bcp.exe
. È molto veloce e sicuro perché Microsoft non è stata tentata di aggiornarlo per anni. Non so molto di DTS, ma nel caso in cui dovessi usarlo per l'automazione, IIRC c'è un modo per invocare utilità esterne. Attenzione però, quel bcp.exe
non restituisce lo stato di errore alla shell in modo affidabile.
Se sei determinato a utilizzare DTS e ad attenerti a CSV, la tua migliore opzione rimanente è scrivere una vista che prepari i dati in modo appropriato per essa. Se tornassi in quell'angolo, creerei uno schema chiamato, diciamo, "DTS2012CSV", in modo da poter scrivere select * from DTS2012CSV.tablename
, dando a chiunque se ne frega una possibilità di lotta per capirlo (perché lo documenterai, vero, nei commenti nel testo della vista?). Se necessario, altri possono copiare la sua tecnica per altri estratti spezzati.
HTH.