2013-10-22 48 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