2013-10-22 58 views
0

以下是代码,我试图将从xml文件中提取的数据格式化为csv.By默认情况下插入的行是明智的。我试图让它更易于理解和解释。 我不是一个专业的编码器,所以请原谅我,如果我的解决方案不是一个优化的。使用php从xml解析csv格式化数据使用php

<?php 
header('Content-Type: application/excel'); 
header('Content-Disposition: attachment; filename="DynaMedResult.csv"'); 

//Using esearch utility capture WebEnv variable 
$url= "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=DynaMed&usehistory=y&retmode=xml"; 
$xml = file_get_contents($url, false, $context); //Reads entire file into a string 
$xml = simplexml_load_string($xml); 

foreach ($xml->WebEnv as $WebenvSearch){ 
    $WebEnv=$WebenvSearch; 
} 
//Using efetch utility and passing WebEnv variable parse the xml 
$url= "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&term=DynaMed&WebEnv=$WebEnv&query_key=1&usehistory=y&retmode=xml"; 
$xml = file_get_contents($url, false, $context); 
$xml = simplexml_load_string($xml); //Interprets a string of XML into an object 
$fp = fopen('php://output', 'w'); 

foreach ($xml as $pubmedst){ 
    $article=$pubmedst->MedlineCitation->Article->ArticleTitle; 
    $pmid=$pubmedst->MedlineCitation->PMID; 
    $journal1=$pubmedst->MedlineCitation->MedlineJournalInfo->MedlineTA; 
    $journal2=$pubmedst->MedlineCitation->MedlineJournalInfo->NlmUniqueID; 
    $pubyear=$pubmedst->MedlineCitation->Article->Journal->JournalIssue->PubDate->Year; 
    $pubmonth=$pubmedst->MedlineCitation->Article->Journal->JournalIssue->PubDate->Month; 
    $pubday=$pubmedst->MedlineCitation->Article->Journal->JournalIssue->PubDate->Day; 
    $authorl=$pubmedst->MedlineCitation->Article->AuthorList->Author->LastName; 
    $authorf=$pubmedst->MedlineCitation->Article->AuthorList->Author->ForeName; 
    $authori=$pubmedst->MedlineCitation->Article->AuthorList->Author->Initials; 

    $val1 = explode("\n", $article); 
    fputcsv($fp, $val1); //Format line as CSV and write to file pointer 
    $val2 = explode("\n", $pmid); //Splits a string by string in our case a newline  
    fputcsv($fp, $val2); 
    $val3 = explode("\n", $journal1.=$journal2); 
    fputcsv($fp, $val3); 
    $val4 = explode("\n", $authorl.=$authorf); 
    fputcsv($fp, $val4); 
    $val5 = explode("\n", $pubyear.=$pubmonth); 
    fputcsv($fp, $val5); 
} 

fclose($fp); 
?> 
+0

我不知道我理解你的问题/问题。什么不起作用? – putvande

+0

它工作正常,但我正在寻找一个更优化的解决方案,如果你尝试运行该程序,你会发现一个输出不是很好的或格式不正确的。那么,*马克B确实对我愚蠢的错误投了一些光。谢谢 –

回答

0

作为每fputcsv()文档,fputcsv()期望给予的数据的ARRAY是作为CSV数据输出。您传递的是单个字符串,因此每个字符串都会成为单列CSV文件中的单个“字段”。

你需要建立一组数据,然后输出数组:

$data[0] = 'foo'; 
$data[1] = 'bar'; 
$data[2] = 'baz'; 

fputcsv($fp, $data); 

会产生

foo,bar,baz