首页 > 解决方案 > 读取txt文件并使用php挑选部分并将每个部分保存到数据库中

问题描述

假设这是我的文本文件,逐行是由 * 分割的一段信息

ID 1*100042176*472**any info**5030*6*1 PA1*101*90*101******

ID 1=ID101 = ID102 = ID103 = and so on

所以我希望能够阅读这些信息并翻译

    ID101=1000042176 
    ID102=472 
    ID103= 
    ID104=any info
    ID105= 
    ID106=5030
    ID107=6 ID108=1
    PA101=101 PA102=90 PA103=101 etc.

每条信息都与一个表条目相关

我可以逐行读取文件,但无法弄清楚如何挑选每一行,然后在 * 之间挑选

任何帮助,将不胜感激。

<?PHP
function readCSV($csvFile){
    $file_handle = fopen($csvFile, 'r');
    while (!feof($file_handle) ) {
        $line_of_text[\n] = fgetcsv($file_handle, 1024);
    }
    fclose($file_handle);
    return $line_of_text;
}


// Set path to CSV file
$csvFile = 'merchant.txt';

$csv = readCSV($csvFile);
echo '<pre>';
print_r($csv);
echo '</pre>';
?>

标签: phpfgets

解决方案


这部分取决于您的示例的文字程度,但您通常可以explode()与正则表达式一起执行此操作。例如,此模式将匹配您提供的可以在线测试的内容。

/^ID (?<G1_ID>\d+)(?<G1>(\*[^*]*)+) PA(?<G2_ID>\d+)(?<G2>(\*[^*]*)+)$/

一旦你测试了模式,你的匹配数组将保存一堆命名值,你可以进一步explode()*它们用作分隔符。

下面是将所有内容放入$final数组的工作示例。

$test = 'ID 1*100042176*472**any info**5030*6*1 PA1*101*90*101******';
$pattern = '/^ID (?<G1_ID>\d+)(?<G1>(\*[^*]*)+) PA(?<G2_ID>\d+)(?<G2>(\*[^*]*)+)$/';

if (!preg_match($pattern, $test, $matches)) {
    throw new RuntimeException('Not matched');
}

$group_1_id = $matches['G1_ID'];
$group_2_id = $matches['G2_ID'];

$group_1_parts = explode('*', $matches['G1']);
$group_2_parts = explode('*', $matches['G2']);

if (count($group_1_parts) < 2) {
    throw new RuntimeException('Group 1 does not have enough asterisks');
}

if (count($group_2_parts) < 2) {
    throw new RuntimeException('Group 2 does not have enough asterisks');
}

$final = [];
for ($i = 1; $i < count($group_1_parts); $i++) {
    $i_padded = str_pad($i, 2, '0', STR_PAD_LEFT);
    $final[] = "ID${group_1_id}${i_padded}=${group_1_parts[$i]}";
}

for ($i = 1; $i < count($group_2_parts); $i++) {
    $i_padded = str_pad($i, 2, '0', STR_PAD_LEFT);
    $final[] = "PA${group_1_id}${i_padded}=${group_2_parts[$i]}";
}


print_r(array_values($final));


推荐阅读