将CSV转换为此新格式

时间:2016-04-22 02:17:31

标签: csv

我有一个按国家/地区排序的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

状态前面有一个短划线,城市在每个州内有2个破折号。

我如何创建此输出?谢谢!

2 个答案:

答案 0 :(得分:0)

请在 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 :(得分:0)

所以我得到了它的工作,感谢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>";
}