Преобразовать фиксированную ширину в CSV?

У меня есть целая куча файлов данных с разным содержимым, но идентичным расположением. Мне нужно преобразовать их в CSV, прежде чем импортировать их в приложение CRM.

Я обычно открываю файл с разделителями табуляции в Excel, который предлагает мне вручную определить позиции табуляции с помощью мастера импорта текста. После открытия файла я конвертирую его в CSV.

Проблема в том, что у меня есть куча этих файлов (скажем, 20-30), и Excel не помнит, что делают в мастере импорта текста, и по причинам, слишком длинным для объяснения, я не могу просто объединить их все в один массовый файл - хотя структура данных идентична.

Мне интересно, есть ли какая-нибудь программа или процесс, который позволил бы мне сохранить "шаблон" структуры файла данных, а затем применить его к каждому файлу, чтобы мне не пришлось создавать его заново вручную?

6 ответов

Решение

Для этого я обычно использую пакетный процесс на языке сценариев.

Например, это AutoIt:

$getfile = FileOpenDialog("Choose a file",@ScriptDir, "*.tsv",7)
If StringInSTr($getfile,"|") = 0 Then
    $split = StringSplit($getfile,"|")
    For $i = 2 to $split[0]
        $file = FileOpen($split[$i])
        StringReplace($split[$i],@TAB,",")
        FileClose($split[$i])
    Next
Else
    $file = FileOpen($getfile)
    StringReplace($file,@TAB,",")
    FileClose($file)
EndIf

Это было бы так же просто в VBScript, Batch, Python или Perl.

Я склонен использовать Textpad для такого рода вещей, так как я могу выполнять поиск и замену с помощью регулярных выражений, поэтому я заменяю вкладки запятыми. Может быть, подобный подход может помочь в вашем сценарии

Если столбцы данных разделены одной или несколькими вкладками каждая

perl -p -i.bak -e "s/\t+/,/g" filenames

где filenames может быть *.tsv например - или список имен файлов.

Если столбцы данных разделены пробелами и ни один из фактических данных не содержит пробелов

perl -p -i.bak -e "s/\s+/,/g" filenames

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

Какие инструменты у вас есть в вашем распоряжении? Например, вы ограничены графическим интерфейсом Windows или, скажем, у вас есть учетная запись оболочки Linux? Вы можете загрузить произвольный мусор, или вы ограничены тем, что находится на вашей рабочей станции из коробки?

Если ничего другого, как насчет открытия файлов в Word / wordpad / notepad и выполнения глобального поиска и замены, заменяя вкладки запятыми? Или, может быть, с ",", если ваш набор данных содержит запятые.

Если вы работаете в Windows и у вас установлен PowerShell, вы можете использовать эту однострочную оболочку, чтобы взять все файлы.CSV в текущей папке, импортировать их как файл с разделителями-табуляциями (`t) и экспортировать их обратно как настоящие CSV-файлы. с тем же именем, но с префиксом "New-":

(get-childitem "*.csv" | foreach ($_) { ($newName="New-"+$_.name) -and (Import-Csv $_.fullname -Delimiter "`t" | Export-Csv .\$newName -notype) }) -and (Remove-Variable "newName")

Для пояснения / написания сценариев, здесь он разбит на несколько строк:

get-childitem "*.csv" | foreach ($_) { 
    $newName="New-"+$_.name
    Import-Csv $_.fullname -Delimiter "`t" | Export-Csv .\$newName -notype
    }
Remove-Variable "newName"

Используя макрос, вы сможете сохранить тип разделителя от фиксированной ширины до csv.

Оттуда относительно легко разобрать весь каталог файлов, открыв их как фиксированную ширину и сохранив их как csv.

Вы можете написать макрос, который обрабатывает все файлы в определенном каталоге таким образом, сохраняя их в выходной каталог после их преобразования.

Другие вопросы по тегам