首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从github上的countries.csv文件中提取Json数据,并创建一个独立的时区数组

从github上的countries.csv文件中提取Json数据,并创建一个独立的时区数组
EN

Stack Overflow用户
提问于 2022-04-01 06:15:36
回答 2查看 207关注 0票数 0

Country.csv

这是countries.csv文件,我想从其中提取所有时区,这是它的第14个colomn,其中的数据没有正确的json formatted。我正试图解析json,但失败了。实际上,我想创建这样一个时区的array

代码语言:javascript
复制
    [0] => {zoneName:'Asia -> Kabul',gmtOffset:16200,gmtOffsetName:'UTC+04:30',abbreviation:'AFT',tzName:'Afghanistan Time'}
    [1] => {zoneName:'Europe -> Mariehamn',gmtOffset:7200,gmtOffsetName:'UTC+02:00',abbreviation:'EET',tzName:'Eastern European Time'}
    [2] => {zoneName:'Europe -> Tirane',gmtOffset:3600,gmtOffsetName:'UTC+01:00',abbreviation:'CET',tzName:'Central European Time'}
    [3] => {zoneName:'Africa -> Algiers',gmtOffset:3600,gmtOffsetName:'UTC+01:00',abbreviation:'CET',tzName:'Central European Time'}
    [4] => {zoneName:'Pacific -> Pago_Pago',gmtOffset:-39600,gmtOffsetName:'UTC-11:00',abbreviation:'SST',tzName:'Samoa Standard Time'}
    [5] => {zoneName:'Europe -> Andorra',gmtOffset:3600,gmtOffsetName:'UTC+01:00',abbreviation:'CET',tzName:'Central European Time'}
    [6] => {zoneName:'Africa -> Luanda',gmtOffset:3600,gmtOffsetName:'UTC+01:00',abbreviation:'WAT',tzName:'West Africa Time'}

我在做什么,这是在App\Http\Controllers\TestController::class,这是

代码语言:javascript
复制
    public function timezone(): void {
        $data = [];

        if (($open = fopen(__DIR__ . '/countries.csv', 'r + b')) !== FALSE) {
            while (($singleRecord = fgetcsv($open, NULL, ',')) !== FALSE) {
                $data[] = $singleRecord;
            }
            fclose($open);
        }

        $data = $this->removeCharacters($data, ['[', ']']);
        $data = $this->removeCharacters($data, (array)'\/', " -> ");

        // $data = $this->removeCharacters($data, (array)'{}', '');
        // dd(explode('},', $data[33][14]));
        // dd(explode('},', $this->longJson));
        // dd(explode(',', str_replace(['{', '}'], '', $data[167][14])));

        $singleArray = [];
        $count = count($data);
        $itemsArray = [];

        for ($i = 1; $i < $count; $i++) {

            $singleArray[] = explode('},', $data[$i][14]);

            foreach ($singleArray as $item) {

                foreach ($item as $singleItem) {

                    $itemsArray[] = $singleItem;

                }
            }
        }
        $itemsArray = array_unique($itemsArray);

        $this->printFormattedData($itemsArray);
    }
 private function removeCharacters($hayStack, array $charsArray, $character = ''): array {
        $tempArray = [];
        foreach ($hayStack as $item) {
            $tempArray[] = str_replace($charsArray, $character, $item);
        }
        return $tempArray;
    }

    private function printFormattedData($data): void {
        echo '<pre>';
        print_r($data);
        echo '</pre>';
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-01 09:27:36

使用regexp它并不完美的解决方案,但您可以使用如下函数将时区数据转换为更正json格式:

代码语言:javascript
复制
public function fixJson(string $str): string {
    return preg_replace(
        '/(?<=(\{|\,))(\w+)(?=\:)/',
        '"$2"',
        str_replace("'", '"', $zoneRaw) // may not work properly, if values may contain apostroph symbols, but seems not actual for your case
    );
}

因此,使用以下函数:

代码语言:javascript
复制
$this->fixJson($data[$i][14]); // returns json string
json_decode($this->fixJson($data[$i][14])); // returns json decoded array

参见这里的用法示例https://sandbox.onlinephpfunctions.com/c/88f21

票数 1
EN

Stack Overflow用户

发布于 2022-04-01 09:15:32

按照代码来做,你的目标是什么。

Please do not forget to mark this answer as ACCEPTED and thumbs up if it solves your problem, so that the work of the developers who help is appreciated and other developers can see in question list, that your question has already an accepted answer.

代码语言:javascript
复制
$lines = file("countries.csv");
array_shift($lines); // remove the first line with column names

$searchReplace  = ['\/' => '->'];
$search = array_keys($searchReplace);
$replace = array_values($searchReplace);

$jsonFormattedTimeZones = [];
foreach($lines as $line)
{
    $line = trim(str_getcsv($line)[14], " []");
    $line = str_replace($search, $replace, $line);
    $jsonFormattedTimeZones[] = $line;
}

print_r($jsonFormattedTimeZones);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71702525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档