Как найти \ n внутри "" в файле - PullRequest
0 голосов
/ 10 июля 2009

Я никогда особо не разбирался в разборе текста на PHP (или на любом другом языке). У меня есть этот текст:

1 (2) ,Yes,5823,"Some Name
801-555-5555",EXEC,,"Mar 16, 2009",0.00,
1 (3) ,,4821,Somebody Else,MBR,,"Mar 11, 2009",,0.00
2 (1) ,,5634,Another Guy,ASSOC,,"Mar 15, 2009",,0.00

Вы видите, что в первой строке есть разрыв, мне нужно, чтобы он был:

1 (2) ,Yes,5823,"Some Name 801-555-5555",EXEC,,"Mar 16, 2009",0.00,
1 (3) ,,4821,Somebody Else,MBR,,"Mar 11, 2009",,0.00
2 (1) ,,5634,Another Guy,ASSOC,,"Mar 15, 2009",,0.00

Я думал об использовании регулярного выражения для поиска \n в кавычках (или после кавычки, поскольку это не приведет к ложным совпадениям), а затем заменил его ничем, используя PHP preg_replace(). В настоящее время я изучаю регулярное выражение, так как не знаю ничего из этого, поэтому я могу выяснить это самостоятельно (это всегда лучше), но, без сомнения, решение моей текущей проблемы поможет мне быстрее разобраться с этим. .

Большое спасибо. Если бы я мог, я бы сразу же получил награду за это.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 июля 2009

Если текст имеет этот фиксированный формат, возможно, вам вообще не понадобится регулярное выражение, просто отсканируйте строку на две двойные кавычки и, если есть только одна, начинайте объединять строки, пока не найдете закрывающую ...

Могут возникнуть проблемы, если могут быть экранированные кавычки, одинарные кавычки для разграничения строк и т. Д., Но если таких вещей нет, с вами все будет в порядке.

Я не знаю PHP, поэтому вот псевдокод:

open = False
for line in lines do
    nquotes = line.count("\"")
    if not open then
        if nquotes == 1 then
            open = True
            write(line)
        else #we assume nquotes == 2
            writeln(line)
        end
    else
        if nquotes == 0 then
            write(line)
        else #we assume nquotes == 1
            open = False
            writeln(line)
        end
    end
 end
1 голос
/ 10 июля 2009

Вот, по сути, ответ Фортрана в PHP

<code><pre>
<?php

$data = <<<DATA
1 (2) ,Yes,5823,"Some Name
801-555-5555",EXEC,,"Mar 16, 2009",0.00,
1 (3) ,,4821,Somebody Else,MBR,,"Mar 11, 2009",,0.00
2 (1) ,,5634,Another Guy,ASSOC,,"Mar 15, 2009",,0.00
DATA;

echo $data, '<hr>';

$lines = preg_split( "/\r\n?|\n/", $data );

$filtered = "";
$open = false;
foreach ( $lines as $line )
{

  if ( substr_count( $line, '"' ) & 1 && !$open )
  {
    $filtered .= $line;
    $open = true;
  } else {
    $filtered .= $line . "\n";
    $open = false;
  }
}

echo $filtered;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...