4

我想在文本文件中获取一些字符串并划分然后转换为 JSON 文件这是我的文本文件 data.txt

"5 minute input rate 134000 bits/sec, 164 packets/sec

5 minute output rate 1320000 bits/sec, 150 packets/sec"

我想得到一个字符串数组并制作一个 JSON 文件可能是这样的:

$time= "5 minute "
$input= "input rate 134000 bits/sec"
$output= "output rate 1320000 bits/sec"
$array[koneksi]= json_decode('[.".$time.":".$input.]');

这是我在 PHP 中的代码

<?php
$lines = file('var/www/datakom/data.txt');
$title = 'data';
    foreach ($lines as $line_num => $line) {
        echo htmlspecialchars($line) . "<br />\n"; }
?>

请帮我。多谢

4

2 回答 2

1

尝试使用这样的正则表达式:

<?php

//helpfull function
function preg_grep_keys( $pattern, $input, $flags = 0 )
{
    $keys = preg_grep( $pattern, array_keys( $input ), $flags );
    $vals = array();
    foreach ( $keys as $key )
    {
        $vals[$key] = $input[$key];
    }
    return $vals;
}

function parseFile(){
      $pattern='/(?<time>\d+)\s+(?<time_unit>\w+)\s+(?<direction>\w+)\s+(.*?)(?<rate>\d+)\s+(?<rate_unit>\w+)(.*?)(?<packets>\d+)/i';
       $lines = file('var/www/datakom/data.txt');
       $title = 'data';
       $json_data=array();
       foreach ($lines as $line_num => $line) {
         preg_match($pattern,$line,$result);
         $json_data[]=preg_grep_keys('/time|time_unit|direction|rate|rate_unit|packets/',$result);
       }

    return json_encode($json_data);
}

?>

您需要调用 parseFile() 函数来解析文件,这将返回一个 json“字符串”。我不确定您是否需要 json string 或 array 。您可以更改 return 语句以返回 json 字符串或二维数组,例如

 return json_encode($json_data);

 or 

 return  $json_data;

注意:我没有测试过,请尝试一下,让我知道

于 2013-05-23T04:29:38.873 回答
0

又快又脏……没有正则表达式……假设:

$out = "5 minute input rate 134000 bits/sec, 164 packets/sec" 

是您要创建数组的字符串,格式如下:

array(
   'time'  => '5',
   'input' => '134000',
   'packets'=> '164'
);

一个可读的非正则表达式解决方案(这可以做得更短,但我想让它明显)

1.)从开始到第一次出现分隔符字符串获取文本:

// find time time interval
$timeDelimiter =  " minute"               // set the delimiter
$timeEnd = strpos($out, $timeDelimiter);  // find the first occurence of delimiter
$time = substr($out, 0, $timeEnd));       // set time to substring before delimiter

现在把这部分从你的弦上剥下来......

$out = substr($out, $timeEnd + strlen($timeDelimiter)); // strip the processed part from $out 

2.) 获取两个分隔符字符串之间的文本

// find the input interval
$inputDelimiterStart = "input rate ";
$inputDelimiterEnd   = " bits/sec";
$inputStartPos       = strpos($out,  $inputDelimiterStart) + strlen($inputDelimiterStart); 
$inputEndPos         = strpos($out, $inputEndDelimiter);
$input               = substr($out, $inputStartPos, $inputEndPos);

然后再次剥离您已经处理的内容

$out = substr($out, $inputEndPos + strlen($inputDelimiterEnd));

3.) ....同样的数据包游戏...(我把它放在这里了..你明白了)

现在你有了 $time, $input, $packets ... 像这样输出 JSON:

echo json_encode(
    array(
         'time'    => $time,
         'input'   => $input,
         'packets' => $packets,
    )
);

您可以将这些东西包装到一个带有 startDelimiter、endDelimiter 参数的函数中,并在此处保存一些代码。最好的解决方案是使用正则表达式,也就是正则表达式……但显然,如果它们不能按照您想要的方式工作,它们会更难学习,也不容易调试。

于 2013-05-23T04:33:48.340 回答