Nie udzieliłbym tej odpowiedzi, z wyjątkiem tego, że tak ciężko pracowałeś, aby to udokumentować, a po miesiącu została ona przegłosowana bez odpowiedzi. Więc zaczyna się. Wydaje się, że jedynym wyborem jest zmiana danych lub zmiana narzędzia.
Gdy narzędzie jest zepsute, a sprzedawca nie dba o to, próbowanie dalej jest błędem. Czas się zmienić. Wkładasz dużo wysiłku w dokładne zbadanie, w jaki sposób jest zepsuty i zademonstrowanie, że narusza nie tylko RFC, ale także własną wcześniejszą wersję narzędzia. Ile więcej dowodów potrzebujesz?
CSV jest też kotwicą łodzi. Jeśli masz taką możliwość, lepiej użyj zwykłego formatu plików z ogranicznikami. W przypadku wielu aplikacji dobrze jest rozdzielać tabulatorami. Najlepszym ogranicznikiem IMO jest „\”, ponieważ ten znak nie ma miejsca w tekście angielskim. (Z drugiej strony nie będzie działać dla danych zawierających ścieżki Windows.)
CSV ma dwa problemy jako format wymiany. Po pierwsze, to nie wszystko jest takie standardowe; różne aplikacje rozpoznają różne wersje, niezależnie od tego, co powie RFC. Po drugie (i pokrewne) to, że nie stanowi zwykłego języka w terminologii CS, dlatego nie można go przeanalizować jako wyrażenia regularnego. Porównaj z ^([^\t]*\t)*[\t]*$
dla linii rozdzielanej tabulatorami. Praktyczną konsekwencją złożoności definicji CSV jest (patrz wyżej) względny brak narzędzi do ich obsługi i ich tendencja do niekompatybilności, szczególnie w godzinach porannych.
Jeśli uruchomisz CSV i DTS, masz dobre opcje, z których jedną jest bcp.exe
. Jest bardzo szybki i bezpieczny, ponieważ Microsoft od lat nie miał ochoty go aktualizować. Nie wiem zbyt wiele o DTS, ale w przypadku, gdy musisz użyć go do automatyzacji, IIRC jest sposób na wywołanie zewnętrznych narzędzi. Uważaj jednak, że bcp.exe
nie zwraca w sposób niezawodny stanu błędu do powłoki.
Jeśli jesteś zdeterminowany, aby używać DTS i trzymać się CSV, to naprawdę najlepszą pozostałą opcją jest napisanie widoku, który odpowiednio przygotuje dane. Gdybym był cofnięty w tym rogu, utworzyłbym schemat o nazwie, powiedzmy, "DTS2012CSV", aby móc napisać select * from DTS2012CSV.tablename
, dając każdemu, kogo to obchodzi, szansę na zrozumienie tego (ponieważ będziesz to dokumentować, prawda, w komentarzach w tekście widoku?). Jeśli zajdzie taka potrzeba, inni mogą skopiować tę technikę do innych uszkodzonych fragmentów.
HTH.