草庐IT

swift : Streaming/Writing out a CSV file

coder 2023-09-12 原文

我正在使用我的手机记录一些传感器数据并通过 SQLite 通过 SharkORM(DBAccess) 将其存储在设备上。

我现在想将该数据写入 CSV 文件,但是,我现在有多达 160 万条记录。

目前,我正在遍历 1000 条记录,将它们添加到一个字符串中,最后将它们写出。但是,一定有更好的方法吗?

func writeRawFile()
    {
        let fileName = "raw"
        let DocumentDirURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

        let fileURL = DocumentDirURL.appendingPathComponent(fileName).appendingPathExtension("csv")

        var data = "time,lat,lon,speed,x_acc,y_acc,z_acc,gyro_x,gyro_y,gyro_z,compass,orientation\r\n"

        let count = RawReading.query().count()
        var counter = 0;
        let df = DateFormatter()
        df.dateFormat = "y-MM-dd H:m:ss.SSSS"

        for i in stride(from:0, to: count, by: 1000)
        {
            autoreleasepool {

                for result in RawReading.query().offset(Int32(i)).limit(1000).fetch()
                {
                    if let raw : RawReading = result as? RawReading
                    {
                        if (Double(raw.speed!) > 3.0) //1 Meter per Second = 2.236936 Miles per Hour
                        {
                            //print(df.string(from: raw.date!))

                            data += "\(df.string(from: raw.date!)),\(raw.lat!),\(raw.lon!),\(raw.speed!),\(raw.x!),\(raw.y!),\(raw.z!),\(raw.xx!),\(raw.yy!),\(raw.zz!),\(raw.compass!),\(raw.orientation!)" + "\r\n"

                            counter += 1
                        }

                    }
                }

                print ("Written \(i) of \(count)")

            }
        }

        print("Count \(count) \(counter)")

        //write the file, return true if it works, false otherwise.
        do{
            try data.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8 )
        } catch{
            print("error")
        }
    }

最佳答案

打开FileHandle用于编写,然后分别构建和编写每一行,这样您就不必保留整个文件内容 在内存中:

do {
    let file = try FileHandle(forWritingTo: fileURL)
    defer { file.closeFile() }

    for <... your loop ...> {
        let line = ... // build one CSV line
        file.write(line.data(using: .utf8)!)
    }

} catch let error {
    // ...
}

也可以先写入一个临时文件,然后重命名为 实际文件,以避免文件损坏 出错了。

关于 swift : Streaming/Writing out a CSV file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42578607/

有关swift : Streaming/Writing out a CSV file的更多相关文章

  1. ruby-on-rails - 如何让 ActionController::Live streaming 与 Thin 一起工作? - 2

    问题你能用thin吗?与ActionController::Live实现服务器端事件(SSE)和长轮询?如果是,怎么办?上下文虽然标题是HowtogetRails4ActionController::LivestreamingworkingwithThinandRuby2?AndhowdoThinandPumascalewithlivestreaming?的重复,OP通过问两个问题混淆了水域,这个问题从未得到回答。许多其他帖子建议您可以使用thin对于服务器端事件(sse),如果您通过execthinstart--threaded启动它:DoesHerokusupportActionC

  2. ruby-on-rails - 服务器发送的事件和 Rails Streaming - 2

    我正在试验Rails4ActionController::Live和ServerSentEvents。我正在使用MRI2.0.0和Puma。就我所见,每个连接的客户端都与服务器保持事件连接。我想知道是否可以在不保持所有响应流运行的情况下利用SSE。Puma使用线程管理多个连接,我想当前连接数是有限制的。如果我想支持成千上万的客户注册到我的Rails应用程序以参加SSE事件的真实场景怎么办?有没有例子?此外,我通常在nginx反向代理后面运行Rails应用程序服务器。它需要任何特定的设置吗? 最佳答案 SSE的构建方式是客户端打开到服

  3. Flink SQL管理平台flink-streaming-platform-web安装搭建-整理 - 2

    目录步骤安装第二步下载flink第三步安装flink-streaming-patform-web第四步配置flinkweb平台第五步运行demo在Flink学习的入门阶段,非常重要的一个过程就是Flink环境搭建,这是认识FLInk框架的第一步,也是为后续的理论学习和代码练习打下基础。今天加米谷大数据就为大家带来Flink环境搭建的步骤解析,帮助大家一步步来部署好Flink环境。步骤1、使用gitclone到本地后,使用IDEA打开项目2、修改数据库连接flink-streaming-web/src/main/resources/application.properties3、在本地数据库中创

  4. javascript - 使用 Twitter Streaming API 和 jQuery? - 2

    推特的StreamingAPI似乎提供了一种无需不断轮询新数据即可接收实时推文的方法。是否可以使用jQuery(或者可能回退到纯JS)来使用此API?据我所知,jQuery没有内置的方法来使用JSON传输HTTP请求。这是正确的,还是我错过了什么?如果此功能不是内置的,是否有人已经使用插件或示例解决了这个问题?更新:据我所知,HTML5对WebSockets的支持可能是实现这一目标的最佳方法。不幸的是,这意味着主流兼容性至少还需要几年时间。据我所知,这些浏览器版本目前以某种方式支持WebSockets:WebKit5(Safari/Chrome)火狐4IE9(最终)

  5. javascript - Rails 3.1 http streaming - js 在头部或 body 底部? - 2

    在Rails3.1中,有一个选项可以启用HTTP流式处理,这样您的页面就可以分块下载。在关于此功能的Railscast中,Ryan建议启用此功能是个好主意,这样您的CSS和JavaScript就可以被拉下,同时页面的其余部分仍在呈现。我一直遵循这样的准则,即在加载所有页面内容后,脚本应位于页面底部,这样可以减少感知加载时间,但这样做不会利用HTTP流式传输。您认为现在最好的做法是什么? 最佳答案 我认为这是一个很好的问题;我觉得有必要到谷歌上寻找答案。将脚本Assets放在页面底部的论据是为了防止阻塞浏览器的渲染器,否则浏览器的渲染

  6. [Spark、hadoop]spark Streaming的核心DStream - 2

    目录SparkStreaming的核心是DStream一、DStream简介二.DStream编程模型三.DStream转换操作SparkStreaming的核心是DStream一、DStream简介1.Spark Streaming提供了一个高级抽象的流,即DStream(离散流)。2.DStream的内部结构是由一系列连续的RDD组成,每个RDD都是一小段由时间分隔开来的数据集。二.DStream编程模型三.DStream转换操作transform()1.在3个节点启动zookeeper集群服务$zkServer.shstart2.启动kafka(3个节点都要)$/opt/module/k

  7. Spark Streaming中流式计算的困境与解决之道 - 2

    Sparkstreaming在各种流程处理框架生态中占着举足轻重的位置,但是不可避免地也会面对网络波动带来的数据延迟的问题,所以必须要进行增量数据的累加。在更新Spark应用的时候或者其他不可避免的异常宕机的时候,增量累加会带来重复消费的问题,在一些需要严格保证exactonce的场景下,这个时候我们就需要进行离线修复,从而保证exactonce语义,本文将针对这个问题,提供一些常见的解决方案和处理方式。下图中展示了数据延迟的一个场景:在讨论解决消息乱序问题之前,需先定义时间和顺序。在流处理中,时间的概念有两个:Eventtime:Eventtime是事件发生的时间,经常以时间戳表示,并和数据

  8. UE4(虚幻4)预算上的纹理流送池(texture streaming poor over)报警解决方法 - 2

    UE4系列文章目录文章目录UE4系列文章目录前言一、第一种方法:修改配置文件(不得行)二、第二种方法:项目设置(可行)前言我们在运行UE4程序时会遇到警告:预算上的纹理流送池,虽然不影响程序正常运行,但就是看着挺刺眼的。有强迫症的我是在忍不哈,于是决定灭了他_一、第一种方法:修改配置文件(不得行)问了一下度娘:纹理流送是运行时将纹理加载和卸载进出内存的系统,当场景中的纹理流送超过默认值将会产生警告,解决方法有两种:1.通过命令行修改流送池单位;2.通过修改\Engine\Config\ConsoleVariables.ini,修改流送池单位:;TextureStreamingPoolValue

  9. swift - 将 json 编码时间转换为 nsdate - 2

    当我将time.Now()编码到JSON对象时,它给出的结果为"2009-11-10T23:00:00Z"但打印时间。现在给出2009-11-1023:00:00+0000UTC。他们为什么不同。什么是T和Z。另外,如何根据this将其转换为swiftNSDate对象?表? 最佳答案 这些值的含义无关紧要,它们是该格式(ISO8601)的一部分。有几种方法可以解决这个问题。一种是为时间或您的结构定义自定义MarshalJSON()方法并使用它来格式化日期,另一种是首先在您的结构中将其表示为字符串,以便当默认实现执行你得到你正在寻找的

  10. objective-c - 为什么 Swift 函数定义语法是多余的? - 2

    在C/C++/Java/Go中,我们使用,来分隔参数:(aint,bint)在ObjectiveC中,我们使用:来表示参数::(int)a:(int)b在Swift中,我们必须同时使用:和,:(a:int,b:int)是否需要冗余? 最佳答案 Swift可能有外部和内部参数名称:(externalinternal:Int)如果没有独特的分隔符,会产生很多歧义。 关于objective-c-为什么Swift函数定义语法是多余的?,我们在StackOverflow上找到一个类似的问题:

随机推荐