Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Не удаляются пробелы из строки


Автор: Mastodont 31.1.2012, 18:44
Есть строка в файле capture.txt

Задача
Большие скопления пробелов преобразовать: первый пробел превратить в табуляцию (чтоб в Excel можно было файлик эскпортировать с разбивкой на столбики), а остальные пробелы - убрать. Получившуюся строку записать в файлик.

Табуляция делается на ура, а вот пробелы - НЕ УБИРАЮТСЯ. Хотя все правильно вроде как. А попытка просто удалить символ через unset($stroka[$udal_prob]); дает ошибку.

Кто знает, в чем дело?

Код

<?php
    //читаем строки capture.txt в массив
    $file_v_vide_stroki = file("capture.txt");
    
    //считаем кол-во элементов массива $file_v_vide_stroki
    $kolvo_file_v_vide_stroki = count($file_v_vide_stroki);
    
    //echo $kolvo_file_v_vide_stroki;
        
    //начинаем работать с каждой строкой capture.txt поочереди    
    
    //это правильный for
    //for ($i = 0; $i < $kolvo_file_v_vide_stroki; $i++)
    
    //а этот просто выдает первую строку
    for ($i = 0; $i < 1; $i++)
    {
        //echo $file_v_vide_stroki[$i];        
        
        $stroka = $file_v_vide_stroki[$i];
        
        //вычисляем длину текущей строки capture.txt
        $dlina_stroka = strlen($stroka);        
        
        //начинаем искать, где пробелов больше одного (в ФИО пробелы должны быть; в остальных местах - глюк распознавания; в этих местах пробелы д.б. заменены на символ табуляции, чтобы потом импортировать capture.txt в Excel)
        for ($k = 0; $k < $dlina_stroka; $k++)
        {                    
            //если очередной символ строки является пробелом
            if ($stroka[$k] == " ")
            {
                //то номер этого символа заносим в массив $nomera_probelov[]
                $nomera_probelov[] = $k;
            }
        }
        
        //найдем идущие подряд пробелы
        foreach ($nomera_probelov as $num_probela)
        {            
            $sled = $num_probela + 1;
            $pred = $num_probela - 1;
            
            //если следующий символ строки - пробел, а предыдущий - не пробел, значит это первый пробел из искомой группы пробелов, и из него нужно сделать \t
            if (($stroka[$num_probela] == $stroka[$sled]) and ($stroka[$num_probela] != $stroka[$pred]))
            {    
                $zamenit_na_tab[] = $num_probela;    
            }
            
            //если предшествующий символ строки - пробел (что было заблокировано предыдущем условием, значит это уже не первый пробел группы пробелов, и его надо просто удалить
            if ($stroka[$num_probela] == $stroka[$pred])
            {    
                $udalit_probeli[] = $num_probela;    
            }
        }            
        
        //заменяем первый пробел на \t
        foreach ($zamenit_na_tab as $zam_tab)
            {
                $stroka[$zam_tab] = "\t";
            }
        
        //остальные пробелы просто удаляем
        foreach ($udalit_probeli as $udal_prob)
            {
                    //ВОТ ОНО НЕ РАБОТАЕТ!!! Пробелы как были, так и есть
                    $stroka[$udal_prob] = "";
            }
        
        //и пишем строку с нужными изменениями в файл
        $text_file = fopen("spisok.txt","a");
        
        fwrite($text_file, $stroka);
        
        fclose($text_file);
    }
    
    
?>

Автор: skyboy 31.1.2012, 20:04
Код

$str = preg_replace('#^\s#', "\t", $str); // заменить начальный пробел табуляцией
$str = str_replace(" ", "", $str); // удалить пробелы

Автор: Mastodont 31.1.2012, 21:25
Цитата(skyboy @ 31.1.2012,  20:04)
Код

$str = preg_replace('#^\s#', "\t", $str); // заменить начальный пробел табуляцией
$str = str_replace(" ", "", $str); // удалить пробелы

Регулярочки плохо знаю, твой код круче)

А str_replace() тоже не работает.

Я ж правильно объяснил, что мне надо?  smile

Надо в "Иванов Николай Петрович" пробелы оставить, а убрать надо между "1275", "Иванов Николай Петрович", "BCГ 4598593" и "O 080105 65" ; )

Автор: skyboy 5.3.2012, 02:31
то есть, у тебя есть строка "1275 Иванов Николай Петрович BCГ 4598593 O 080105 65" и надо получить "1275Иванов Николай ПетровичBCГ 4598593O 080105 65"? я уж не спрашиваю, как программа должна "понять", что надо "Иванов Николай Петрович ВСГ 4598593" разбить именно так, а не "Иванов Николай" и "Петрович ВСГ 4598593". хотя бы скажи, зачем тебе пробелы удалять? по чем тогда эксель будет определять значения?

Автор: Atos 5.3.2012, 11:11
Цитата(Mastodont @  31.1.2012,  18:44 Найти цитируемый пост)
$stroka[$udal_prob] = "";
  smile  smile  smile  smile в баш 

вместо этого хотя бы так  
Код

$stroka =  substr($stroka, 0, $udal_prob).substr($stroka, $udal_prob+1, strlen($stroka)-$udal_prob-1);




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)