Преобразовать фиксированную ширину в 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.
Вы можете написать макрос, который обрабатывает все файлы в определенном каталоге таким образом, сохраняя их в выходной каталог после их преобразования.