社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

preg_match_all循环对于每个匹配,验证是否为空以设置要插入到表mysql中的空值

italo_pm • 3 年前 • 1631 次点击  

我有10行要从文件文本中提取,其中一些行是空的,但存在,其他行不存在,但我必须插入它们,使用regex可以按10组分割文本,我使用preg_match_all来匹配组并生成一个匹配数组,但如果不存在的行不匹配,我希望在mysql表中插入值组,如果值为空,则将其设置为NULL。

我只需要它们的值,但首先要验证键是否存在,并为此添加缺少的键和空值。

如果该值为空,则将其设置为NULL;如果文本文件中不存在该组,则添加一个值,将其设置为NULL,以插入表mysql。

请参阅更新问题

我应该使用array_push、array_key_exists或在regex中为每个组分配一个名称?

最后,如何循环每个匹配?使用preg_match_,all只生成一个完全匹配的数组,但我的表mysql只生成10列,每个组一个regex。

更新问题:我将帖子的措辞改为11/24/21 01.00

例如,完整数据为10行

/*
First Name         :NameAAAAAA
LINE TO EXCLUDE    : this line is to exclude     
Last Name          :LastAAAAAA
LINE TO EXCLUDE    : this line is to exclude
Gender = (F/M)     :
ANOTHER LINE TO EXCLUDE : this line is to exclude                             
        TEST INFO 1      :TI1AAAAAA
        ANOTHER LINE TO EXCLUDE  : this line is to exclude             
        TEST INFO 2      :       
        TEST INFO 3      :TI3AAAAAA
First Name         :NameBBBBBB
LINE TO EXCLUDE    : this line is to exclude     
Last Name          :LastBBBBBB
LINE TO EXCLUDE    : this line is to exclude
Gender = (F/M)     :
First Name         :NameCCCCCC
LINE TO EXCLUDE    : this line is to exclude     
Last Name          :LastCCCCCC
LINE TO EXCLUDE    : this line is to exclude
Gender = (F/M)     :M
ANOTHER LINE TO EXCLUDE : this line is to exclude                             
        TEST INFO 1      :
        ANOTHER LINE TO EXCLUDE  : this line is to exclude             
        TEST INFO 2      :TI2CCCCCC       
        TEST INFO 3      :
*/

要使用正则表达式仅提取行(6行):

https://regex101.com/r/hWzvOr/1

/.*(?:First Name).*|.*(?:Last Name).*|.*(?:Gender = \(F\/M\)).*|.*(?:TEST INFO 1).*|.*(?:TEST INFO 2).*|.*(?:TEST INFO 3).*/g

使用正则表达式模式提取后的以下字符串:可能会发现不存在的行(请参见组名BBBB中的测试信息1-2-3)

$str = '
First Name         :NameAAAAAA    
Last Name          :LastAAAAAA                 
Gender = (F/M)     :                            
        TEST INFO 1   :TI1AAAAAA     
        TEST INFO 2   :       
        TEST INFO 3   :TI3AAAAAA  
First Name         :NameBBBBBB   
Last Name          :LastBBBBBB                 
Gender = (F/M)     :                                                                                 
First Name         :NameCCCCCC   
Last Name          :LastCCCCCC                 
Gender = (F/M)     :M                            
        TEST INFO 1   :     
        TEST INFO 2   :TI2CCCCCC       
        TEST INFO 3   : 
';

如果不存在(不匹配),则通过动态创建密钥,并将值设置为NULL,如果值为空,则将其设置为NULL。

必须生成(参见组名BBBB中的测试信息1-2-3)

Array
(
    [0] => Array
        (
            [0] => First Name         :NameAAAAAA    
            [1] => Last Name          :LastAAAAAA                 
            [2] => Gender = (F/M)     :                            
            [3] =>         TEST INFO 1   :TI1AAAAAA     
            [4] =>         TEST INFO 2   :       
            [5] =>         TEST INFO 3   :TI3AAAAAA 
            [6] => First Name         :NameBBBBBB    
            [7] => Last Name          :LastBBBBBB                 
            [8] => Gender = (F/M)     : 
            [9] =>         TEST INFO 1   :                        
            [10] =>        TEST INFO 2   :
            [11] =>        TEST INFO 3   :                             
            [12] => First Name         :NameCCCCCC    
            [13] => Last Name          :LastCCCCCC                 
            [14] => Gender = (F/M)     : M                           
            [15] =>         TEST INFO 1   :                        
            [16] =>         TEST INFO 2   :TI2CCCCCC
            [17] =>         TEST INFO 3   :                                          
        )

)

如果在正则表达式中不匹配,如何创建密钥?循环生成一个包含所有数据的数组,但我将每个循环的6行值插入一个表中,表中有6列?

提前谢谢。

当做

伊塔洛。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131242
 
1631 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Rick James
Reply   •   1 楼
Rick James    3 年前

我会分多个步骤来处理这个问题:

$str = '
      APPLICATION ID                   :AAAAA#AA#0101       
      STATUS P=PENDING/A=ACTIVE        :A                    
      VALID-TO DATE                    :711231               
      APPLICATION TYPE (A/G)           :A                    
      DESCRIPTIVE TEXT                 :DESC folder AAAAA    
      OWNER ID                         :               
      RANDOM INFO                      :                     
            PERIOD OR RUN CYCLE GROUP NAME   :QAZ123XX        
            RUN CYCLE VALID-FROM             :711230          
            RUN CYCLE VALID-TO               :711231          
            RUN CYCLE DESCRIPTION            :MANUAL ORDER    
            RUN RANDOM IFO                   :                
      APPLICATION ID                   :BBBBB#BB#0101       
      STATUS P=PENDING/A=ACTIVE        :A                    
      VALID-TO DATE                    :711231               
      APPLICATION TYPE (A/G)           :A                    
      DESCRIPTIVE TEXT                 :                     
      OWNER ID                         :OWNER1               
      RANDOM INFO                      :                     
';

$groups = explode('APPLICATION ID', $str);
foreach ($groups as $group) {
    echo "----\n";
    $hash = [];
    if (empty($group)) continue;
    $group = 'APPLICATION ID' . $group;
    $lines = preg_split("/\n/", $group);
    foreach($lines as $line) {
        $kv = explode(':', $line);
       if (count($kv) == 2 && trim($kv[1]) != '')
            $hash[trim($kv[0])] = trim($kv[1]);
    }
    print_r($hash);

    // TODO:  Build an INSERT with just the values in $hash
    // Meanwhile, each column should be `DEFAULT NULL`.
}

产量:

----
Array
(
)
----
Array
(
    [APPLICATION ID] => AAAAA#AA#0101
    [STATUS P=PENDING/A=ACTIVE] => A
    [VALID-TO DATE] => 711231
    [APPLICATION TYPE (A/G)] => A
    [DESCRIPTIVE TEXT] => DESC folder AAAAA
    [PERIOD OR RUN CYCLE GROUP NAME] => QAZ123XX
    [RUN CYCLE VALID-FROM] => 711230
    [RUN CYCLE VALID-TO] => 711231
    [RUN CYCLE DESCRIPTION] => MANUAL ORDER
)
----
Array
(
    [APPLICATION ID] => BBBBB#BB#0101
    [STATUS P=PENDING/A=ACTIVE] => A
    [VALID-TO DATE] => 711231
    [APPLICATION TYPE (A/G)] => A
    [OWNER ID] => OWNER1
)

另一个小贴士: NULLIF(?, '')

Casimir et Hippolyte
Reply   •   2 楼
Casimir et Hippolyte    3 年前
  1. 构建一个数组,将所有需要的键和值设置为null:
$columns = [
    'APPLICATION ID',
    'STATUS P=PENDING/A=ACTIVE',
    /*...*/
    'RUN CYCLE DESCRIPTION'
];

$keys = array_fill_keys($columns, null);
  1. 构建一个模式来提取字符串中的键和值。要做到这一点,在模式中放置所有需要的键是完全无用的,只需要使用捕获组(此处命名)将键与每个匹配的值隔离(注意 价值 组(可选):
$pat = '~^ \h*+ (?<key> [^:\n]* [^:\s] ) \h* : (?<value> \S+ (?:\h+\S+)* )? ~xm';
  1. 使用 preg_match_all PREG_UNMATCHED_AS_NULL 标志:当可选 价值 组不匹配,返回值为 null 而不是空字符串。
    预赛 匹配结果,用 $matches['key'] $matches['value'] 子阵列(请注意,此子阵列的键与阵列的键相同 $keys 但最终一些钥匙丢失了)。
    那么你所要做的就是合并 $keys 使用此新数组进行数组,以获取包含您感兴趣的键/值对的关联数组。
if ( preg_match_all($pat, $yourstring, $matches, PREG_UNMATCHED_AS_NULL) ) {
    $result = array_combine($matches['key'], $matches['value']);
    // $result = array_intersect_key($result, $keys); // if you need to exclude some key/value pairs from the string
    $result = array_merge($keys, $result);
}

1,2,3新鲜水3