我有这个输出(来自另一个系统)我需要将测试字段放在一行上。 这个愚蠢的系统单词包含45个字符(每行前有30个空格)
这是我的示例输出(我需要输入)
Name:
Pepsi
Test:
The Result was blah
and blah
Tester:
John
Name:
Sprite
Test:
The result was negative
Tester:
Jane
Etc etc
有时候,测试之后的行会被包装(有些时候没有)
我需要将该行无文字包装,以便我可以在访问中导入它。
该文件大约是2mb,并且有很多实例需要清理。这就是我试图编写这个脚本的原因。
感谢
---------------- EDIT -------------
这是我到目前为止所提出的。但我不能让它取代
<?php
function replace_newline($string) {
return (string)str_replace(array("\r", "\r\n", "\n", " ", " ", " ", " "), ' ', $string);
}
function GetBetween($content,$start,$end){
$r = explode($start, $content);
foreach($r as $value){
$t = explode($end, $value); //$t[0] between value
$result = trim(preg_replace('/[\t\r\n]+/', ' ', trim($t[0])));
$result = trim($result);
$result = replace_newline($result);
if ( !strstr($result, "Name:") ) {
echo $result . "\r\n";
$test = str_replace($t[0], $result, $test);
}
}
}
$test= file_get_contents("4321.txt");
GetBetween($test, "Test:", "Tester:");
?>
输出:
结果是等等等等
结果是否定的
答案 0 :(得分:0)
这可能不是正常工作的代码,但你明白了这个想法:
$cur = "";
foreach ($line as $l)
{
if (strpos($l, ':') !== FALSE)
{
// Keep track of a new chunk
if ( !empty(trim($cur)) ) { /* Write old data if not empty */ }
// Start new chunk
$cur = trim($l);
}
// Not a new chunk, add to end of last one
$cur .= ' '. trim($l);
}
// Write the last chunk here
// Close file
你可能用一个疯狂的正则表达块完成这一切,但我没心情去解决它。
我知道我说我不会使用正则表达式,但是这里是:
function getChunks($data)
{
// Clean up whitespace
$data = preg_replace('/\s+/', ' ', $data);
// Create an anchor point before the label word
$data = preg_replace('/\w+:/', '##\0', $data);
// Separate the data into chunks based on anchors
$sets = explode('##', $data);
// Keep any and all chunks that aren't empty
$sets = array_filter($sets, function($d) { return !empty(trim($d)); } );
// array_filter() can damage the indexing, so return just the values
return array_values($sets);
}
我没有测试过代码,但评论应该是一些指导 请注意,这仅适用于1)只有标签包含分号和2)标签只有一个字长。此外,您不希望在海量数据集上运行此操作。它没有针对这类事情进行优化。它针对快速肮脏进行了优化。