【问题标题】:How do I convert this CSV to a better format using PHP?如何使用 PHP 将此 CSV 转换为更好的格式?
【发布时间】:2016-08-15 11:35:57
【问题描述】:

我有一个按国家、州和城市排序的 CSV 文件。它看起来像这样:

USA,California,Arcata
USA,California,Bakersfield
USA,California,Barstow
USA,California,Berkeley
USA,California,Chico
USA,California,Delano
USA,California,El Centro
USA,California,Eureka
USA,California,Fresno
USA,California,Irvine
USA,Colorado,Colorado Springs
USA,Colorado,Denver
USA,Colorado,Durango
USA,Colorado,Fort Collins

我想创建一个如下所示的输出文件:

USA
-California
--Bakersfield
--Barstow
--Berkeley
--Chico
--Delano
--El Centro
--Eureka
--Fresno
--Irvine
-Colorado
--Colorado Springs
--Denver
--Durango
--Fort Collins

我希望各州前加一个破折号,而城市在每个州内前加两个破折号。

我在 WordPress 上使用 PHP。有人可以帮我创建这个输出吗?谢谢!

【问题讨论】:

  • 使用什么编程语言,到目前为止你尝试过什么?
  • 向我们展示您目前拥有的...
  • 您想要解决方案的技术是什么?您需要 PowerShell 脚本还是 C# 代码或 java 代码等?
  • 在您使用的任何操作系统上打开您最喜欢的文本编辑器。开始用你最喜欢的编程语言编写代码,将第一个示例中的文本转换为第二个示例中的格式。那里-我已经以与您在编写问题时使用的相同程度的特异性回答了您的问题。现在edit您的问题并使其更具体。你使用什么编程语言?到目前为止,您为自己解决这个问题做了什么?您编写的代码在哪里,您遇到了哪些具体问题?我们不是代码编写服务。
  • 使用(或实现)关联数组,然后转换结果。

标签: php wordpress csv formatting


【解决方案1】:

请在 PowerShell 中检查以下脚本。我假设只有一个国家。条目可以以任何方式混淆。

另外,我假设下面这一行是 CSV 中标题的第一行:

Country,State,City

您也可以在任何其他编程语言中使用类似的逻辑。

$csvInput = Import-Csv -Path "C:\Data\Test\abc.csv" | Sort-Object State

$outputFileContent = @()

$outputFileContent += ($csvInput[0].Country)

$oldState = ""
$newState = ""
foreach($csvRow in $csvInput)
{
    $newState = $csvRow.State
    if($newState -ne $oldState)
    {
        $outputFileContent+= ( "-" + $csvRow.State)
    }
    $oldState = $newState

    $outputFileContent += ("--" + $csvRow.City)
}

$outputFileContent | Out-File -FilePath "C:\Data\Test\testOutput.txt"

将“C:\Data\Test\abc.csv”替换为您的输入 CSV 文件,将“C:\Data\Test\testOutput.txt”替换为输出文件的路径。

【讨论】:

  • 谢谢阿曼!棒极了!实际上会有多个国家,但我明白你在这里做什么: 1. 打开 CSV 文件 2. 检查每一行 3. 查看国家/州是否与之前相同 4. 输出城市
【解决方案2】:

所以我得到了它,感谢 Aman 和 Ken 的提示并向我展示了一个起点。这不是特别优雅的代码,但确实可以完美运行。

对于任何好奇的人,请将下面的代码复制/粘贴到 yourfile.php 中,按照我上面的格式创建 CSV 文件并保存为 list.csv,将这两个文件放到您的 PHP 服务器上,然后在浏览器中执行 yourfile.php ,它会按预期输出结果。

$myfile = fopen("list.csv", "r") or die("Unable to open file!");

//echo fread($myfile,filesize("list.csv"));

fclose($myfile);

$csv = array_map('str_getcsv', file('list.csv'));

//echo is_array($csv) ? 'Array' : 'not an Array';

//$line=1; //If you need to compare the array with your CSV to make sure all lines are included

foreach ($csv as $i => $row)
{
    $lastcountry=$country;
    $laststate=$state;

    $country="";
    $state="";
    $city="";

    $country=trim($row[0]);
    $state=trim($row[1]);
    $city=trim($row[2]);

    if ($country <> $lastcountry) {
        echo $country . "<br>";
    }
    if ($state <> $laststate) {
        echo "-" . $state . "<br>";
    }
    echo "--" . $city . "<br>";

    //$line++;
    //echo $line . " <strong>Country:</strong> " . $country;
    //echo " <strong>State: </strong> " . $state;
    //echo " <strong>City: </strong>" . $city . "<br>";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多