【问题标题】:Read .csv to a multidimensional array, then pass it to JavaScript将 .csv 读取到多维数组,然后将其传递给 JavaScript
【发布时间】:2013-10-25 07:42:47
【问题描述】:

我有一个由用户在 Microsoft Excel 中生成的 .CSV 文件,需要将其转换为 Web 表单。

id,partial-allowed,amount,description,contents,price
0,TRUE,88 count,California Fancy Navels,,27
1,TRUE,48 count,Texas Rio Star Red Grapefruit,,22
2,TRUE,100 count,Washington Red Delicious Apples,,40
3,TRUE,100 count,Washington Golden Delicious Apples,,40
4,TRUE,100 count,Braeburns,,40
5,FALSE,40 count,Apple Sampler,"8 Red Delicious, 8 Golden Delicious, 8 Granny Smith, 8 Fuji, 8 Braeburn",22
6,FALSE,20 count,Apple Sampler,"4 Red Delicious, 4 Golden Delicious, 4 Granny Smith, 4 Fuji, 4 Braeburn",16
7,FALSE,18 pound,Number 1 Mixed Fruit Box,"18 Navel Oranges, 8 Red Delicious Apples, 10 Braeburn Apples",20
8,FALSE,18 pound,Number 2 Mixed Fruit Box,"14 Navel Oranges, 6 Red Delicious & 6 Braeburns Apples, 10 D’Anjou Pears",20
9,FALSE,18 pound,Number 3 Mixed Fruit Box,"8 Grapefruit, 12 Navel Oranges, 10 Braeburn Apples",20
10,FALSE,18 pound,Number 4 Mixed Fruit Box,"6 Grapefruit, 12 Navel Oranges, 4 Red Delicious & 4 Braeburn Apples 6 D’Anjou Pears",20
11,FALSE,18 pound,Number 5 Mixed Fruit Box,11 Grapefruit and 18 Oranges,20

我成功地将它导入 PHP 并使用它正确生成表单,但现在它无法正确传递到 JSON。

<?php
$csvHandle = fopen('Sale Data/Fruit-Sale.2013.csv', 'r');

$partialCase = array();
$completeCase = array();

//used to skip the header row
$keys = fgetcsv($csvHandle, 0, ',');

while(($data = fgetcsv($csvHandle, 0, ',')) !== FALSE) {
    $item = array(
        //changes the string value to a numeric value
        'id' => intval($data[0]),
        //changes the string value to a boolean value
        'partial-allowed' => filter_Var($data[1], FILTER_VALIDATE_BOOLEAN),
        'amount' => $data[2],
        'description' => $data[3],
        'contents' => $data[4],
        //changes the string value to a numeric value
        'price' => intval($data[5])
        );
    $item['partial-allowed'] == true ?
        array_push($partialCase, $item) : array_push($completeCase, $item);
}
echo "\npartialCase\n";
//outputs properly as an array, or an object if I pass the constant JSON_FORCE_OBJECT
echo json_encode($partialCase);
echo "\ncompleteCase\n";
//outputs nothing
echo json_encode($completeCase);
?>

最初它是从 CSV 中作为单个数组取出的,然后被拆分为两个数组,但我发现这是不必要的并将其取出 [它也不起作用]。我快要扯掉头发了,想知道为什么一个数组正确传递而另一个数组没有正确传递。

下面是输出,我也想不通为什么它没有分成多行。编辑:感谢@Duotrigesimal

,这已得到纠正
partialCase[{"id":0,"partial-allowed":true,"amount":"88 count","description":"California Fancy Navels","contents":"","price":27},{"id":1,"partial-allowed":true,"amount":"48 count","description":"Texas Rio Star Red Grapefruit","contents":"","price":22},{"id":2,"partial-allowed":true,"amount":"100 count","description":"Washington Red Delicious Apples","contents":"","price":40},{"id":3,"partial-allowed":true,"amount":"100 count","description":"Washington Golden Delicious Apples","contents":"","price":40},{"id":4,"partial-allowed":true,"amount":"100 count","description":"Braeburns","contents":"","price":40}]completeCase

【问题讨论】:

  • 我不会使用这样的三元语句。三元适用于条件赋值,但不适用于控制结构。
  • @Phil 注意到并更改了。
  • 成功了吗?我做了一些测试,我认为三元可能会起作用,尽管它很丑
  • 是的,使用三元与切换到 if/else 的行为相同。该数组仍未正确传递到 JSON。
  • 省略fgetcsv 的可选参数怎么样?只需尝试fgetcsv($csvHandle)

标签: php json csv


【解决方案1】:

我可以回答你问题的最后一部分。通过将JSON_PRETTY_PRINT 常量传递给json_encode 可以将json 输出到多行。如果您使用的是 php 5.4+,则此功能可用。

echo json_encode($partialCase, JSON_PRETTY_PRINT);

【讨论】:

  • 我的意思是为什么 PHP 没有将它输出到页面上的多行,在我的数据转储中查看有什么问题。它只是忽略换行符序列。传递它也没有将它输出到多行。
  • 哦,那是因为 HTML 大多数时候会忽略 \n 字符。要么我们&lt;br&gt;,要么在你的输出之前放一个&lt;pre&gt;标签。
  • 谢谢,解决了。
【解决方案2】:

经过大量修改后,我设法解决了这个问题。 这一行:

'contents' => $data[4],

需要将 & 和逗号转义,如下所示:

'contents' => htmlentities($data[4], ENT_NOQUOTES)

由于"’"没有转义字符,需要在CSV文件中改为"'"

【讨论】:

  • 感谢您在解决问题后反馈!人们在这方面做得还不够。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2013-04-17
相关资源
最近更新 更多