2016-09-02 41 views
1

最近我在这里找到了一些关于javascript的帮助。我需要解析CSV文件并将其输出为HTML。将这些表格输出转换为div输出

有人能够大量帮助我。唯一的问题是它作为单行表输出。在CSV文件中,每行没有特定数量的列/数据,这意味着行数据的长度会有所不同。

我一直在试图做的是写一些if语句只接收'Last name'或'known for'之类的东西,所以我可以给出结果的一些命令。

这样做的最好方法是什么?我需要设置输出数据的样式,所以我认为div id会比表格更好。另外,我应该在哪里编辑代码(我的JavaScript知识非常初学者)。

if语句我试图(可能完全错误的):

function firstName($container){ 
     var firstN = $container; 
     var n = firstN.includes("First Name"); 

    if (n != 0){ 
     document.getElementById("first_name").innerHTML="First name = "; 
     return; 
    } 
    } 

主要的代码块(CSV文件可以在http://www.fooda.website/testResults.csv找到):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script src="jquery-1.12.3.min.js" type="text/javascript"> 
</script> 
<title>Untitled Document</title> 
<script type="text/javascript"> 
// ============================ 
// Allow for a cached result 
// ============================ 
var csvRows = []; 
// ============================ 

// ============================ 
// Given an array of rows build a table. 
// ============================ 
function buildTable(csvRows){ 
    // Our base result 
    var $table = $("<table cellpadding=\"2\" cellspacing=\"0\"></table>"); 

    // ============================ 
    // For each row in the CSV build a <tr /> and append it to the <table /> 
    // ============================ 
    $table = csvRows.reduce(function($table, csvRow){ 

    // For this demo just take the first few cells/columns 
    var csvRowCells = csvRow.split(","); 

    // Our base table row 
    var $tr = $("<tr>/tr>"); 

    // ============================ 
    // For each cell row build a <td /> and append it to the <tr /> 
    // ============================ 
    $tr = csvRowCells.reduce(function($tr, csvRowCell){ 
     return $tr.append($("<td>/</td>").text(csvRowCell)); 
    }, $tr); 
    // ============================ 

    // Add our new <tr /> to the table then return the table 
    return $table.append($tr); 
    }, $table); 
    // ============================ 

    return $table; 
} 
// ============================ 

// ============================ 
// Given an array of rows, randomly select one (as an array) and build a table with it. 
// ============================ 
function fillContainerWithTable(csvRows, $container){ 
    var randomRow = [csvRows[Math.floor(Math.random() * csvRows.length)]]; 
    var $table = buildTable(randomRow); 
    $container.append($table); 
} 
// ============================ 

// ============================ 
// the click handler 
// ============================ 
function myFunction(){ 
    // some random csv I found... 
    var uri = "http://www.fooda.website/testResults.csv"; 
    var $container = $("#wrap"); 

    // You probably want a clean slate. 
    $container.empty(); 

    // ============================ 
    // If we have the data locally already just use it. 
    // ============================ 
    if (csvRows.length !== 0){ 
    console.log("using local data..."); 
    fillContainerWithTable(csvRows, $container); 
    return; 
    } 
    // ============================ 

    console.log("fetching remote data..."); 

    $.get(uri, function(data){ 
    csvRows = data.split("\n"); 
    fillContainerWithTable(csvRows, $container); 
    }); 
} 
// ============================ 
</script> 
<style type="text/css"> 
body { 
    font-family: arial, helvetica, sans-serif; 
    font-weight: normal; 
    font-size: 13px; 
    color: #000; 
    text-align: left; 
    margin: 3px 0px; 
} 

#wrap { 
    padding: 20px; 
} 

#wrap table { 
    border: solid 1px; 
    border-collapse: collapse; 
    background-color: aliceblue; 
    height:400px; 
    width:100%; 
} 

#first_name { 
    height:200px; 
    width:200px; 
    background-color:#0C0; 
} 

</style> 
</head> 



<body> 


<button onclick="myFunction()">Click me</button> 
<div id="wrap"></div> 

<div id="first_name"> 
</div><!--first_name--> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 


</body> 
</html> 

在此先感谢!

+0

看起来像你的 “CSV”,实际上是JSON,是这样吗? – henry

+1

@henry:我认为同样的事情,但它更像是每一行都是一个JSON对象。但你说得对,“CSV”在这方面失去了一切意义。 gezer4000:你可以控制“CSV”格式吗?如果将数据转换为真正的JSON,处理起来会容易得多。如果您设置为CSV,则应考虑实施更类似CSV的布局,其中每列表示特定类型的值,即使该列为空。 – TheJim01

+0

@ TheJim01包含的文件只是一个结果样本。实际文件是CSV并且有大约700个条目。我对JavaScript很陌生,因此我不确定怎么解析JSON。我正在寻找一种方法来获取CSV行中的每个条目并使用一些代码在HTML中输出它以过滤结果,以便只显示某些值。 – gezer4000

回答

1

简短回答是“这是许多重复的'如何将JSON转换为HTML表格'关于SO的问题”,最后我只是指出你对其中的一些问题,但我想通过它来引导你。

CVS(逗号分隔值)看起来像

Col1,Col2,Col3,Col4 
row1value1,row1value2,row1value3 
row2value1,row2value2 
row3value1,,row3value3,row3value4 

虽然不是一定的情况下,你能想到的CSV作为一个非常紧凑的方式文本只写一个表,其中每一行的值是相同的顺序(如表格列),空单元格看起来像“,,”。如果上面的CSV是一个表(例如,如果其导入到Excel等),这将是

Col1  Col2  Col3  Col4 
row1value1 row1value2 row1value3 
row2value1 row2value2 
row3value1   row3value3 row3value4 

你的数据,而另一方面,实际上是JSON“对象”,每行一个列表。在JSON中,对象包含在{ }中,并且由“键/值”对组成。 JSON对象貌似

{"key1":"value1", "key2":"value2"} 

JSON,您可以组对象为阵列。一个JSON数组包含在[ ]中。

在JSON,上表中会是什么样子

[{'Col1':'row1value1','Col2':'row1value2','Col3':'row1value3'}, 
{'Col1':'row1value1','Col2':'row1value2'}, 
{'Col1':'row1value1','Col3':'row1value3','Col4':'row1value4'}] 

当使用JSON的工作,你可以说“遍历数组中的每个对象”和“当前对象,给我Col2值。 “ (注意,这意味着相关的JSON对象不必按照相同的顺序列出键/值对,并且不必指定缺少的值。)如果你知道你的阵列中的每个可能的密钥(在这种情况下,会是Col1中,col2的,COL3和COL4),你可以说

“循环遍历数组,把每个对象在<tr>,并为每个 对象首先把Col1中值在<td>,然后把值Col2中在 一个<td>,然后把COL3值在<td>,然后把COL4 值在<td>“。

这正是你想要做的......事实证明,已经有一堆工具可以做到这一点!站在你和使用它们之间的唯一方法是在你的文件的开始处输入[,在除了最后一行之外的每行的末尾处输入,,并且在文件的末尾输入]。如果你能做到这一点,你很幸运。如果这是静态数据,只需在文本编辑器中打开数据并使用查找/替换来添加行尾逗号。如果它是动态生成的,你将不得不想出一种方法来添加东西(解决方案将在[上加上一些东西,将文件拆分为},分割每个数据块后面跟着一个,除非它是最后一个块,然后添加],然后通过JSON到HTML表工具运行)。我会留下如何做到这一点 - 如果你陷入困境,肯定会打开一个新的“我如何将json对象列表转换为json数组”问题。我不是JSON专家,我打赌有一些标准的做法

以下是一些有希望的JSON到HTML表格解决方案。我会很有兴趣知道他们中的一个是否适合你!

+0

感谢您的回复@henry 那么你是说我应该将文件转换为JSON?这怎么可能? 你会建议什么样的工具?再次,我对此很新。 – gezer4000

+0

我的意思是说你并没有真正的CSV,就像通常使用的那样。你几乎几乎都有一个JSON文件,你只是在每行的末尾缺少逗号,并且围绕整个事情括号。如果您可以添加这些工具,您可以使用任何现有的JSON到HTML表格工具!我已经改写了我的评论,将它变成更真实的答案 – henry