2011-05-13 56 views
1

这可能是一个棘手的问题,因此您可以获得积分!在PHP中解析逗号分隔文件然后添加到数据库

THIS IS .txt文件不是CSV

我试图解析以下逗号分隔的文件转换成可读的表,然后导入到一切我的表。这里是我得到的信息:

这是我从中导入的“模板”。 (这是文件中的第一行):

"Public/Private","Record Manager","Company","Contact","Address 1","Address 2","Address 3","City","State","Zip","Country","ID/Status","Phone","Fax","Home Phone","Mobile Phone","Pager","Salutation","Last Meeting","Last Reach","Last Attempt","Letter Date","Title","Assistant","Last Results","Referred By","User 1","User 2","User 3","User 4","User 5","User 6","User 7","User 8","User 9","User 10","User 11","User 12","User 13","User 14","User 15","Home Address 1","Home Address 2","Home City","Home State","Home Zip","Home Country","Alt Phone","2nd Contact","2nd Title","2nd Phone","3rd Contact","3rd Title","3rd Phone","First Name","Last Name","Phone Ext.","Fax Ext.","Alt Phone Ext.","2nd Phone Ext.","3rd Phone Ext.","Asst. Title","Asst. Phone","Asst. Phone Ext.","Department","Spouse","Record Creator","Owner","2nd Last Reach","3rd Last Reach","Web Site","Ticker Symbol","Create Date","Edit Date","Merge Date","E-mail Login","E-mail System" 

这里是什么样的人通常会进入一个样本:

"Public","John Doe”,"Einstein Construction","Bill Gates","3441 State Route 1","","","Somecity","CA","15212","","","724-555-2135","","","","","Jill","","4/18/2011","11/23/2009","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Bill","Gregor","235","","","","","","","","","","Tom Jones","SuperMart","","","www.website.com","","11/14/2009","4/19/2011","","","" 

下面是我在数据库中的字段(MySQL的):(显然不的美元符号。)

 $rep 
     $date 
     $account 
     $areacode 
     $number 
     $address1 
     $address2 
     $city 
     $state 
     $zip 
     $country 
     $fax 
     $descmaker1 
     $descmaker2 
     $title 
     $email 
     $cvendor 
     $cequipment 
     $leaseexp1 
     $leaseexp2 
     $leaseexp3 
     $leaseexp4 
     $leaseexp5 
     $leaseexp6 
     $volume 
     $notes 
        $lastchange 

这就是我需要它们映射到..(我在右路,左边的文件)

    Record Manager -> $rep 
(record manager i'd rather use our variable which is = $session->userinfo['fullname'] 
     Create Date -> $date (can the "/" be removed so its MMDDYYYY) 
     Company -> $account 
     Phone (can you explode the areacode off?) -> $areacode 
     Phone (and put the number after the areacode here?)-> $number 
     Address 1 -> $address1 
     Address 2 -> $address2 
     City -> $city 
     State -> $state 
     Zip -> $zip 
     Country -> $country 
     Fax -> $fax 
     Salutation -> $descmaker1 
     $descmaker2 
     Title -> $title 
     Email Login -> $email 
        Edit Date -> $lastchange 

我现在所拥有的(这真的不起作用)如下。它显示了一个大混乱中的数据。

<?php 


$a = file_get_contents("upload/contacts.txt"); 
$a = str_replace(array("\r\n", "\t") , array("[NEW*LINE]" , "[tAbul*Ator]") , $a); 

print "<table border=\"1\">"; 
foreach(explode("[NEW*LINE]" , $a) AS $lines){ 
echo "<tr>"; 
foreach(explode("[tAbul*Ator]" , $lines) AS $li) { 
echo "<td>"; 
echo $li ; 
} 
echo "</tr>"; 

} 

echo "</table>"; 


?> 
+0

你可以使用Perl的? – HaloWebMaster 2011-05-13 19:04:48

+0

您是否试图将csv文件数据导入到db表中?或者将csv文件数据呈现为html表格? – 2011-05-13 19:06:58

+0

不知道我的服务器是否支持它。我不知道任何perl语法,所以你不得不忍受我。我有一个godaddy Linux主机帐户。我想它会支持它! – 2011-05-13 19:07:31

回答

4
$file = fopen('mass-parse.txt', 'r'); 

while ($line = fgets($file)) { 
    list( $rep, $date, $account, $areacode, $number, 
      $address1, $address2, $city, $state, $zip, $country, 
      $fax, $descmaker1, $descmaker2, $title, $email, 
      $cvendor, $cequipment, $leaseexp1, $le, $leaseexp3, $leaseexp4, $leaseexp5, $leaseexp6, 
      $volume, $notes, $lastchange) = explode(',', str_replace('"','',$line)); 

    // do stuff with variables 
} 
+0

感谢您花时间写这篇文章!正是我想要的,我现在可以修改。 – 2011-05-13 20:18:21

1

对于使用PHP解析CSV数据文件,看http://php.net/manual/en/function.fgetcsv.php

+0

不是CSV。正如它在问题中所说的那样。 – 2011-05-13 19:12:12

+0

你有没有尝试使用fgetcsv解析文件? – 2011-05-13 19:15:08

+0

是的,它是一个CSV。每行一条记录,用逗号分隔的行上有多个值...(C)omma(S)eparated(V)alues。 – 2011-05-13 19:16:29

2

对于在CSV文件中读取(它是一个,无论.txt扩展名),你可以使用这个片段代替繁琐的手工读取和分裂:

$csv = array_map("str_getcsv", file("upload/contacts.txt")); 

Whatsmore,你可能需要调查LOAD DATA INFILE,例如MySQL经常可以直接导入这样的数据结构。

LOAD DATA INFILE 'upload/contacts.txt' 
INTO TABLE contacts 
(rep, date, account, areacode, number, address1, city, ...) 

(你必须照顾与文件中的发生的匹配到合适的数据库列名!)

+0

马里奥,我认为你的第一个例子可能会导致一个非常大的$ csv数组,并导致内存限制问题,如果被导入的文件很大。我忘记了LOAD DATA INFILE,优秀的提示 – 2011-05-13 19:24:16

+0

是的,的确如此。它容易消耗大量的内存(主要是由于PHP数组处理),所以这种懒惰的方法仅适用于中等大小的文件。 – mario 2011-05-13 19:27:42

+0

我如何才能将事件与您给我的例子相匹配? – 2011-05-13 20:08:11