Как мне вставить CRLF после запятой в CSV-файл без CRLF? - PullRequest
0 голосов
/ 15 сентября 2009

Мне передали CSV-файл, представляющий собой просто число чисел с запятыми между

, например

1,2,3,4,5,6

и т.д.

После запятых нет crlf, поэтому я не могу импортировать их в excel или базу данных для дальнейшей обработки.

Кто-нибудь знает, как я могу обработать этот файл, используя пакетный файл или VBA, чтобы вставить crlf после каждой запятой?

Спасибо, Стив

Ответы [ 5 ]

2 голосов
/ 15 сентября 2009

Если у вас есть доступ к VBA, напишите функцию поиска и замены, которая читает из одного файла и записывает в другой. Обычно я бы использовал FileSystemObject, но он не всегда доступен в контролируемых средах.

Public Sub ReplaceInFile(sOld As String, sNew As String, _
 sFind As String, sReplace As String)
'-----------------------------------------------------
' Procedure : ReplaceInFile
' Author    : cmsjr
' Date      : 9/15/2009
' Purpose   : Make up for lack of text manipulation in windows shell
' Sample    
' Call ReplaceInFile("C:\DelimisFun.txt", "c:\NewFile2.txt", ",", "," & vbCrLf)
' Parms     :
' sOld is the file you want to change
' sNew is the new file, should not be the same as the old ;)
' sFind what you are looking for
' sReplace, what you would like to see instead
'
'------------------------------------------------------------
'
On Error GoTo Error_Proc

    Dim lin, lout As Integer 'file handles
    Dim strBuff As String 'buffer
    If Dir(sOld) = "" Then 'can't read what's not there
        MsgBox "Invalid File"
    Else
        lin = FreeFile
        Open sOld For Input As #lin 'open input
         lout = FreeFile
        Open sNew For Append As #lout 'open output
        Do Until EOF(lin) 'loop through file
            Line Input #lin, strBuff 'read the old
            Write #lout, Replace(strBuff, sFind, sReplace) 'write the new
        Loop
    End If
Exit_Proc:
    Close #lin
    Close #lout
    Exit Sub
Error_Proc:
    MsgBox Err.Description, vbOKOnly
    Resume Exit_Proc
End Sub

Подход к файлу с супер злыми битами

Но что, если у нас не было VBA или каких-либо инструментов в стиле * nix. Вот один нецелесообразный способ

  1. Создайте bat-файл, который будет перебирать его параметры командной строки и отображать их в жестко запрограммированный файл. Обратите внимание на использование shift, это сдвигает следующий аргумент командной строки на один индекс (значение $ 2 теперь равно $ 2 и т. Д.), Это работает для нас, потому что файл bat будет игнорировать запятые в аргументах командной строки (для For Обратите внимание, что мы также заменяем запятую, поскольку она была проигнорирована. Я не проверял это на больших наборах данных, он хорошо работал на 2000 строк.

    @ ECHO OFF : Loop ЕСЛИ "% 1" == "" GOTO Продолжить

    echo %1, >> NewFile.txt
    

    SHIFT GOTO Loop : Продолжить

  2. Обернуть вызов файла bat в цикл for, поэтому мы в основном передаем каждое значение с разделителями-запятыми в текстовом файле в качестве аргумента командной строки в файл bat.

    для / F% x in (delimisfun.txt) do c: \ bats \ winreplace.bat% x

0 голосов
/ 16 сентября 2009

SPlitCSV.cmd

@ эхо выключено

Для / f "tokens = *" %% A в (% 1) вызовите: ProcessLine %% A

goto: eof

: ProcessLine

echo %1
shift
if [%1]==[] goto :eof
goto :ProcessLine           

goto: eof

Test.CVS 1,2,3,4,5

SplitCSV.cmd Test.csv

1 2 3 4 5

0 голосов
/ 15 сентября 2009

Вы можете использовать утилиту linux или cygwin tr

cat FILENAME | tr , '\n'
0 голосов
/ 15 сентября 2009

Вы также можете использовать sed:

sed 's/,/,\r\n/g' FILENAME

(Вы также можете использовать опцию -i для замены на месте в файле)

0 голосов
/ 15 сентября 2009

Вы можете сделать это с чем-то вроде notepad2 ...

ctrl + H -> заменить "," на ", \ r \ n" и поставить галочку "Преобразовать обратную косую черту"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...