当前位置: 首页 > 面试题库 >

在Swift中解析CSV文件

谢财
2023-03-14
问题内容

应用启动时,我需要将数据预加载到tableView中。所以我通过解析.csv文件来使用核心数据。为此,我正在关注本教程。这是我的parseCSV函数

func parseCSV (contentsOfURL: NSURL, encoding: NSStringEncoding, error: NSErrorPointer) -> [(stationName:String, stationType:String, stationLineType: String, stationLatitude: String, stationLongitude: String)]? {
    // Load the CSV file and parse it
    let delimiter = ","
    var stations:[(stationName:String, stationType:String, stationLineType: String, stationLatitude: String, stationLongitude: String)]?

    let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error)
    stations = []
    let lines:[String] = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]

    for line in lines {
        var values:[String] = []
        if line != "" {
            // For a line with double quotes
            // we use NSScanner to perform the parsing
            if line.rangeOfString("\"") != nil {
                var textToScan:String = line
                var value:NSString?
                var textScanner:NSScanner = NSScanner(string: textToScan)
                while textScanner.string != "" {

                    if (textScanner.string as NSString).substringToIndex(1) == "\"" {
                        textScanner.scanLocation += 1
                        textScanner.scanUpToString("\"", intoString: &value)
                        textScanner.scanLocation += 1
                    } else {
                        textScanner.scanUpToString(delimiter, intoString: &value)
                    }

                    // Store the value into the values array
                    values.append(value as! String)

                    // Retrieve the unscanned remainder of the string
                    if textScanner.scanLocation < textScanner.string.characters.count {
                        textToScan = (textScanner.string as NSString).substringFromIndex(textScanner.scanLocation + 1)
                    } else {
                        textToScan = ""
                    }
                    textScanner = NSScanner(string: textToScan)
                }

                // For a line without double quotes, we can simply separate the string
                // by using the delimiter (e.g. comma)
            } else  {
                values = line.componentsSeparatedByString(delimiter)
            }

            // Put the values into the tuple and add it to the items array
            let station = (stationName: values[0], stationType: values[1], stationLineType: values[2], stationLatitude: values[3], stationLongitude: values[4])
            stations?.append(station)
        }
    }


    return stations
}

这是我的示例.csv文件

Rithala,Underground,Yellow Line,28.7209,77.1070

但我在这条线上出现错误

let station = (stationName: values[0], stationType: values[1], stationLineType: values[2], stationLatitude: values[3], stationLongitude: values[4])
            stations?.append(station)

致命错误:数组索引超出范围

我究竟做错了什么 ?请帮我。


问题答案:

您正在尝试解析文件路径而不是文件内容。

如果您更换

let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error)

与:

if let data = NSData(contentsOfURL: contentsOfURL) {
  if let content = NSString(data: data, encoding: NSUTF8StringEncoding) {
    //existing code
  }
}

那么代码将适用于您的示例文件。



 类似资料:
  • 问题内容: 我正在研究一个很长的Bash脚本。我想将CSV文件中的单元格读取到Bash变量中。我可以解析行和第一列,但不能解析其他任何列。到目前为止,这是我的代码: 它仅打印第一列。作为附加测试,我尝试了以下操作: $ y是空的。所以我尝试了: $ y是。为什么? 问题答案: 您需要使用而不是: 请注意,对于一般用途的CSV解析,您应该使用专门的工具,该工具可以处理带有内部逗号的带引号的字段,以及

  • 问题内容: 我在解析Json文件时遇到问题。尝试解析一个Json文件: 这是我为其定义的两个结构。 暂停结构: AttachedModel模型结构: 然后,我为其创建一个键和一个函数: 在功能上: 这是输出 问题是,即使有数据,该行也始终为假,并且转到“ 有人可以告诉我这里的问题在哪里吗? 问题答案: 为您的json创建此模型类: 然后,您可以像这样解析它:

  • 在这段代码中,目标是解析一个CSV文件,并将其数据映射到一个bean对象。 文件中的列在原始数据下方有一个标题,有时还有其他信息(如字符串或整数单元格中的数字或单词)。 我在之前的问题中询问如何忽略这些附加信息,并得到了以下代码作为答案: 当我尝试实现此代码时,我在箭头标记的行处出现两个错误。 线程"main"中的异常java.lang.错误:未解决的编译问题: 列表类型中的方法 add(Coun

  • 我正在加载一个CSV文件,需要解析两个字符串到localdate。基本上我的项目是关于一个高分列表。 CSV文件中的格式示例:{David,18.01.2019,Easy,00:05:30} 现在我知道这与我之前在timeFormat中定义的格式有关,但我仍然没有发现我的错误。希望你们能帮帮我!

  • 问题内容: 我正在解析CSV文件,但是最后一行的最后9列为空,只有一行,并且用逗号分隔的字符串会忽略其余的空列。 这是演示此代码的代码: 列的大小为20,应为29。任何想法? 问题答案: 查看有关以下内容的文档: 该方法的工作方式就像通过调用带有给定表达式且限制参数为零的二参数拆分方法。因此,结尾的空字符串不包括在结果数组中。 因此,您需要查看其他方法的选项 limit参数控制应用图案的次数,因此

  • 问题内容: 我想用php上传一个csv文件。上传文件后,我想显示CSV文件的数据。我想举一个如何完成这项任务的例子。 问题答案: 尽管您可以轻松找到如何使用php处理文件上传的教程,并且有一些功能(手动)可以处理CSV,但是我将发布一些代码,因为几天前我从事一个项目,其中包括一些代码,您可以采用… HTML: PHP: 我知道必须有一种更简单的方法来执行此操作,但是我读取了CSV文件并将每个记录的