2016-04-16 2 views
0

У меня большая проблема. Я провел много измерений с помощью измерительной программы. Я получаю несколько файлов * .SP8, которые представляют собой не что иное, как текстовые файлы. С Automator я мог бы переименовать все в * .csv.найти и заменить сценарий оболочки для создания полезного файла csv

Мне нужен скрипт, который очищает мои первые 29 строк содержимого. Затем сценарий должен заменить все пробелы точкой с запятой.

Сценарий должен найти все csv-файлы в указанной папке во всех подпапках.

В идеале он найдет первое место в одной строке и заменит его точкой с запятой и очистит остальную часть линии.

Файл выглядит следующим образом:

Test 
22.01.2016 
.. 
Tester 
20160122_BM_BLANK 

User 

20160122_BM_BLANK 
Text 
@@6.000 5.350 1.000 12.000 8.500 1020.000 60.000 940.000 4.773 0.000 1.500 14.800 0.000 100.000 0.000 9.000 0 
@@SWB 533 [blank] 
blank 
SK 999100.10 
no 


100Nm.SEN 
100 Nm 
Last 01/2013 
SN: "HBM,Spider8-55/01,08231,P32" 






1200 
7200 
0 -0.015238 0 -0.0465 0 
0 -0.015238 0 -0.0465 0.000833 
0 -0.025 0 -0.0465 0.001667 
... following 6000 lines of code like this ... 
384.5 -0.025 0 -0.0465 5.9975 
384.5 -0.025 0 -0.0465 5.998333 
384.5 -0.025 0 -0.0465 5.999166 

End 

Это должно быть превращена в это:

0;-0.015238 
0;-0.015238 
0;-0.025 
... following 6000 lines of code like this ... 
384.5;-0.025 
384.5;-0.025 
384.5;-0.025 

Цель состоит в том, чтобы загрузить это в EXCEL и создать график

+3

'for', чтобы найти все файлы,' для/f' для их обработки ('skip' пропустить первые п строк,' токенов 'чтобы получить то, что вы хотите),' echo' для печати. Попробуйте. Мы поможем вам, но мы не будем делать вашу работу. Подробнее см. [Для/?](http://ss64.com/nt/for.html). – Stephan

+1

спасибо - я дам ему попробовать – PhilHarmonie

+1

[shell] и [sh] imply 'nix, но [batch-file] и Excel подразумевают пакетный файл Windows - что это такое? – dbenham

ответ

1

С tail и sed :

tail -n +30 file | sed 's/^\([^ ]*\) \+\([^ ]* \).*/\1;\2/;/^$/{N;/End/d}' 

tail удаляет первые 29 строк.

sed строки поиска и захвата, начинающиеся с символов пробела, за которыми следует одно или несколько пробелов, за которыми следуют символы пробела, за которыми следует одно пробел. Обе захваченные группы выводятся с ; между ними.

/^$/{N;/End/d} удаляет линию End.

Чтобы рекурсивно применить эти команды для всех файлов .csv, начиная с текущего каталога:

find . -name "*.csv" -print0 -exec sh -c 'tail -n +30 {} | sed "s/^\([^ ]*\) \+\([^ ]* \).*/\1;\2/;/^$/{N;/End/d}" > {}.new' \; 

Все обработал файлы будут суффикс с расширением .new.

+0

Спасибо. файл был создан, но он пуст – PhilHarmonie

+0

Он работал для меня с вашим примером кода. Он не будет работать, если файлы не имеют одинаковой структуры. Каков результат первой команды с 'tail' и' sed'? – SLePort

1

Используя JREPL.BAT regular expression find/replace utility, чистую полезность сценария (гибрид JScript/пакетное), которая работает изначально на любом компьютере Windows, от XP вперед:

@echo off 
pushd "yourRootPath" 
for /f "eol=: delims=" %%F in (
    'findstr /smc:" " *.csv' 
) do call jrepl " +" ";" /a /jbegln "skip=(ln<30)" /f "%%F" /o - 
popd 

команда находит Findstr и списки всех файлов .CSV, которые содержат пробел (уже преобразованные файлы больше не будут иметь места).

Команда FOR/F выполняет итерацию каждого результирующего файла.

JREPL.BAT остальное делает

  • поиска/замены заменяет каждый прогон последовательных пространств с одного ;
  • /a только измененные строки печатаются
  • /jbegln ... игнорирует первые 29 строки
  • /f "%%F" Указывает исходный файл
  • /o - Заменяет исходный файл с результатом
1

Я написал этот PHP-скрипт, который делает работу отлично:

<?php 
$base = "BM_BLANK_"; 

for ($i = 1; $i <= 1; $i++) { 
    $myfile = fopen($base.$i.".txt", "r") or die("Kann Datei nicht öffnen!"); 
    $arr = explode(PHP_EOL, substr(strstr(fread($myfile, filesize($base.$i.".txt")),"1200"),12,-8)); 
    foreach($arr as $key => $value) { 
    $new[$key] = explode(" ", $value); 
    unset($new[$key][2]); 
    unset($new[$key][3]); 
    unset($new[$key][4]); 
    } 
    $newfile = fopen($i.".csv", "w"); 
    $txt = ""; 
    foreach($new as $sch => $wert) { 
    $txt .= $wert[0].";".$wert[1]."\n"; 
    } 
    fwrite($newfile, $txt); 
    fclose($newfile); 
    fclose($myfile); 
} 
?> 
Смежные вопросы