2012-06-12 2 views
0

У меня есть файл flatfile (csv delimited) с 60 значениями, которые необходимо заменить 60 различными новыми значениями.Сценарий для замены текста в плоском файле

Original_Value1 ---> New_Value1 
Original_Value2 ---> New_Value2 
Original_Value3 ---> New_Value3 
Original_Value4 ---> New_Value4 

.... до 60.

Файл имеет более 200к записей с 60 значениями, которые должны быть изменены. Каков наиболее эффективный способ достижения этого?

+0

Возможный дубликат [поиск и замена значений в плоском файле с использованием PHP] (http://stackoverflow.com/questions/2944080/find-and-replace-values-in-a-flat-file-using- php) – mario

ответ

0

Предполагая

1) длина старых и новых значений могут отличаться

2) вы не знаете, какие строки содержат значения, которые будут изменены загодя

петли через файл, line by line, используя fgetcsv() , проверяйте поля в этой строке, делая необходимые замены. Напишите строку обратно в другой файл, используя fputcsv()

+0

Да, длина старых и новых значений различается, однако есть 1 конкретный столбец, который я искал для изменения данных. Столбец содержит код, соответствующий местоположению категории в реализации Magento. Текущий пример значения «001094500» должен стать «\ Store \ Shoes» Спасибо за ваш ответ! –

+0

ой, я понял ... вы хотите, чтобы я отправилtehcodez ... – goat

+0

Честно говоря, мои технические возможности ограничены, я учусь. Был бы признателен, если бы вы могли помочь n00b. –

0

Perl. По крайней мере, это было бы мой совет, должен быть в состоянии сделать это в одной строке .... что-то вдоль линий

open(IN, " < filename.csv "); 
open(OUT, " > output.csv "); 

while (<IN>) { # reads in each line of the file 
    $line =~ s/Original_Value1/New_Value1/gi; # g is for global, i is to ignore case 
    $line =~ s/Original_Value2/New_Value2/gi; # g is for global, i is to ignore case 
    $line =~ s/Original_Value3/New_Value3/gi; # g is for global, i is to ignore case 
    # ... continue to your values... probably a better way of doing this from a file, but this is quick and dirty, and should work 
    print OUT $line; # prints out $line to the output file. 
} 
close(IN); 
close(OUT); 

Это было бы близко в любом случае, я не написал Perl в довольно долгое время и это, вероятно, может быть оптимизирован до нескольких символов кем-то хорошее в PERL гольф ... =)

+0

Просто увидел, что это может быть только PHP ... если это так, другие ответы будут более полезными ... – Cyric297

+0

Я поставил PHP, PERL является приемлемым. Поэтому сценарий, использующий мой пример, должен выглядеть так: open (IN, " output.csv"); while () { $ line = ~ s/Original_Value1/New_Value1/gi; $ line = ~ s/Original_Value2/New_Value2/gi; print OUT $ line; $ line = ~ s/Original_Value3/New_Value3/gi; $ line = ~ s/Original_Value4/New_Value4/gi; } close (IN); близко (OUT); Благодарим за ответ! –

+0

Пробовал этот пример и получил выходной файл 0k с одним значением, которое нужно изменить. –

0

Вот пример кода:

$input = 'input.txt'; 
$output = 'output.txt'; 

if ($fpin = fopen($input, 'r')) { 
    if ($fpout = fopen($output, 'a')) { 
    while ($data = fread($fpin, 1024)) { 
     fwrite($fpout, your_replacement_function($data)); 
    } 

    fclose($fpout); 
    } 

    fclose($fpin); 
} 
0

Посмотрите на fgetcsv прочитать файл построчно и добавьте некоторый код, чтобы увидеть, содержит ли каждая строка строку, которую вы хотите заменить.

После прочтения каждой строки сделайте то, что вам нужно, и напишите в новом файле. Вы можете использовать fputcsv для записи CSV. Наконец, удалите старый файл.

Возможно, кто-то знает способ отредактировать середину файла? Я не думаю, что это возможно.

+0

По сути, я ищу, чтобы заменить данные в определенном поле на основе заданных значений. Спасибо за ваш ответ! –