Giter VIP home page Giter VIP logo

csv.swift's Introduction

CSV.swift

Open Source Helpers

CSV reading and writing library written in Swift.

Usage for reading CSV

From string

import CSV

let csvString = "1,foo\n2,bar"
let csv = try! CSVReader(string: csvString)
while let row = csv.next() {
    print("\(row)")
}
// => ["1", "foo"]
// => ["2", "bar"]

From file

NOTE: The default character encoding is UTF8.

import Foundation
import CSV

let stream = InputStream(fileAtPath: "/path/to/file.csv")!
let csv = try! CSVReader(stream: stream)
while let row = csv.next() {
    print("\(row)")
}

Getting the header row

import CSV

let csvString = "id,name\n1,foo\n2,bar"
let csv = try! CSVReader(string: csvString,
                         hasHeaderRow: true) // It must be true.

let headerRow = csv.headerRow!
print("\(headerRow)") // => ["id", "name"]

while let row = csv.next() {
    print("\(row)")
}
// => ["1", "foo"]
// => ["2", "bar"]

Get the field value using subscript

import CSV

let csvString = "id,name\n1,foo"
let csv = try! CSVReader(string: csvString,
                         hasHeaderRow: true) // It must be true.

while csv.next() != nil {
    print("\(csv["id"]!)")   // => "1"
    print("\(csv["name"]!)") // => "foo"
}

Provide the character encoding

If you use a file path, you can provide the character encoding to initializer.

import Foundation
import CSV

let stream = InputStream(fileAtPath: "/path/to/file.csv")!
let csv = try! CSVReader(stream: stream,
                         codecType: UTF16.self,
                         endian: .big)

Reading a row into a Decodable object

If you have a destination object that conforms to the Decodable protocol, you can serialize a row with a new instances of the object.

struct DecodableExample: Decodable {
    let intKey: Int
    let stringKey: String
    let optionalStringKey: String?
}

let csv = """
    intKey,stringKey,optionalStringKey
    1234,abcd,
    """

var records = [DecodableExample]()
do {
    let reader = try CSVReader(string: csv, hasHeaderRow: true)
    let decoder = CSVRowDecoder()
    while reader.next() != nil {
        let row = try decoder.decode(DecodableExample.self, from: reader)
        records.append(row)
    }
} catch {
    // Invalid row format
}

Usage for writing CSV

Write to memory and get a CSV String

NOTE: The default character encoding is UTF8.

import Foundation
import CSV

let csv = try! CSVWriter(stream: .toMemory())

// Write a row
try! csv.write(row: ["id", "name"])

// Write fields separately
csv.beginNewRow()
try! csv.write(field: "1")
try! csv.write(field: "foo")
csv.beginNewRow()
try! csv.write(field: "2")
try! csv.write(field: "bar")

csv.stream.close()

// Get a String
let csvData = csv.stream.property(forKey: .dataWrittenToMemoryStreamKey) as! Data
let csvString = String(data: csvData, encoding: .utf8)!
print(csvString)
// => "id,name\n1,foo\n2,bar"

Write to file

NOTE: The default character encoding is UTF8.

import Foundation
import CSV

let stream = OutputStream(toFileAtPath: "/path/to/file.csv", append: false)!
let csv = try! CSVWriter(stream: stream)

try! csv.write(row: ["id", "name"])
try! csv.write(row: ["1", "foo"])
try! csv.write(row: ["1", "bar"])

csv.stream.close()

Installation

Swift Package Manager

Add the dependency to your Package.swift. For example:

// swift-tools-version: 5.9

import PackageDescription

let package = Package(
    name: "MyPackage",
    dependencies: [
        // Add `CSV.swift` package here.
        .package(url: "https://github.com/yaslab/CSV.swift.git", from: "2.5.0")
    ],
    targets: [
        .executableTarget(
            name: "MyCommand",
            dependencies: [
                // Then add it to your module's dependencies.
                .product(name: "CSV", package: "CSV.swift")
            ]
        )
    ]
)

CocoaPods

pod 'CSV.swift', '~> 2.5.0'

Reference specification

License

CSV.swift is released under the MIT license. See the LICENSE file for more info.

csv.swift's People

Contributors

bouk avatar choefele avatar codetriage-readme-bot avatar gallgall avatar mbarclay avatar mxcl avatar pefaymon avatar uberjason avatar vipt avatar yaslab avatar yoiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

csv.swift's Issues

Is there anyway to write data into array

I trying to add each row automatically by running for-loop but it keep telling me index out of range there

` let itemList = objectNo
let fileManager = FileManager.default

    let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
    csvFile = documentDirectory.appendingPathComponent("\(fileName!).csv")
    let path = csvFile
    
    let stream = OutputStream(url: csvFile!, append: false)
    let csv = try! [CSVWriter(stream: stream!)]
    try! csv[0].write(row: ["name", "x", "y", "width", "height"])
    
    for no in 0..<itemList.count - 1 {
        try! csv[no].write(row: [String(describing: objects.dataName[no]), String(describing: objects.dataX[no]), String(describing: objects.dataY[no]), String(describing: objects.boundingX[no]), String(describing: objects.boundingY[no])])
    }
    csv[itemList.count].stream.close()`

Output CSV?

Are there plans to add outputting csv files as well?

Doesn't escape strings with newlines.

I would love to submit a fix, @yaslab please let me know if I can go ahead.

Also-- I see you have some automated tests. I've never run automated tests in Xcode, but I was thinking I can figure it out and add a contributing.md file for this repo to document how to run and add tests for future features or bugfixes. Might make it easier for others to open up good pull requests and share the workload.

Decode Bool

You can add "0" and "1" values to the Boolean decoder ?
"0" = false
"1" = true

Add append support for CSVWriter

Hello. I was looking to have a CSV file that gets updated every time a user performs an action in an app. I also wanted the CSV file to contain a header row.

Subsequent appends won't be started on a new line because isFirstRow is defaulted to true, causing write to ignore the configuration.newline.unicodeScalars.forEach(writeScalar) call.

I thought I could just add a beginNewRow() call, but it technically doesn't modify the steam

Here is the code I was trying:

           let exists = FileManager.default.fileExists(atPath: url.path)
           
           let stream = OutputStream(url: url, append: true)!
           let csv = try! CSVWriter(stream: stream)
           
           if !exists {
               try! csv.write(row: ["Date", "Question 1", "Question 2", "Question 3"])
           }

           try! csv.write(row: [rfcDate, answer1, answer2, answer3])

           csv.stream.close()

Support for Int-type CodingKey

I've been working to add support & tests for Int typed CodingKey, for supporting Decodable with or without headers. Can I claim this feature if you're not already on it?

Expected Behavior:

  • When implementing Decodable for a type, developer can use Int type enum for CodingKey
  • Value of the enum maps to column of the data
  • Header row should be ignored
  • Developer continues to use Configuration struct to indicate the presence/absence of header row

Example:

    class IntKeyedDecodableExample: SupportedDecodableExample {
        private enum CodingKeys: Int, CodingKey {
            case intKey = 2
            case stringKey = 0
            case optionalStringKey = 1
            case dateKey = 4
            case enumKey = 5
        }
    }

csv.write not following RFC4180

RFC4180 states:

   6.  Fields containing line breaks (CRLF), double quotes, and commas
       should be enclosed in double-quotes.  For example:

       "aaa","b CRLF
       bb","ccc" CRLF
       zzz,yyy,xxx

   7.  If double-quotes are used to enclose fields, then a double-quote
       appearing inside a field must be escaped by preceding it with
       another double quote.  For example:

       "aaa","b""bb","ccc"

but this code:

try! csv.write(row: ["id", "testing,\"comma"])

generates this:

id,testing,"comma

instead of this:

id,"testing,""comma"

Error handling

Because it cannot detect the errors in parse, to be able to detect.

decoding causes memory leak

This code causes a memory leak.

struct DecodableExample: Decodable {
    let dateKey: Date
    let stringKey: String
    let optionalStringKey: String?
}


for i in 1...20 {
    var records = [DecodableExample]()
    var ii = 0
    do {
        let csv = try String(contentsOfFile: "/tmp/test.txt", encoding: .utf8)
        let reader = try CSVReader(string: csv, hasHeaderRow: true, trimFields: true, delimiter: ";", whitespaces: .whitespaces)
        let decoder = CSVRowDecoder()
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        decoder.dateDecodingStrategy = .formatted(formatter)
        while reader.next() != nil {
            ii += 1
            let row = try decoder.decode(DecodableExample.self, from: reader)
            records.append(row)
        }
    } catch {
        print("\(ii)-\(error)")
    }
    print(i)
}

file :
test.txt

memory graph:
image

required architectures 'i386 x86_64' issue

hi all,
how to solve this issue
Showing Recent Messages
Target 'Library' of project 'Library' was rejected as an implicit dependency for 'Library.framework' because its architectures 'x86_64' didn't contain all required architectures 'i386 x86_64'

Issue with text containing double quotes

Hi,

I've got a issue with string containing double quotes (").

Ex: The string in CSV file looks like this:
"Click "Yes" to continue on"

When using this library to read it, the output comes out like so:
"Click "es"to continue on"

The character Y is missing, and there is no space between the later half of the double qoute and the next word.

How to fix this?

memory leaks

This code causes a memory leak.
If I use JSON decoder then there is no memory leak.
Any idea how to fix this?

import Foundation
import CSV

typealias  TestCodable = Test & Codable

protocol Test {
    func baz()
}

struct Product1:TestCodable {
    var title:String
    var price:Int
    var quantity:Int
    func baz() {
        print(title)
    }
}

let csv = """
title,price,quantity
Nike,10,1
Nike1,11,1
Nike2,12,1
Nike3,13,1
Nike4,13,1
Nike5,13,1
Nike6,13,1
"""

let json = """
{
"title": "Nike",
"price": 10,
"quantity": 1
}
"""
let data = json.data(using: .utf8)!
var arrayProduct: [Test] = []
let reader = try CSVReader(string: csv, hasHeaderRow: true)
let decoder = CSVRowDecoder()

while reader.next() != nil {
//    let product: Product1 = try! JSONDecoder().decode(Product1.self, from: data)
    let product = try! decoder.decode(Product1.self, from: reader)
    arrayProduct.append(product)
    print("\(product)")
    sleep(4)
}

Getting error in let csv = try! CSVWriter(stream: stream)

I am trying to update a CSV file in local intranet server.

guard let stream = OutputStream(toFileAtPath: peopleListSheetURL, append: false) else { return }
stream.open()
** peopleListSheetURL is a path to a CSV file in local intranet server**
let csv = try! CSVWriter(stream: stream). ---**Here getting error Fatal error: 'try!' expression unexpectedly raised an error: CSV.CSVError.cannotOpenFile: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-900.0.74.1/src/swift/stdlib/public/core/ErrorType.swift, line 181 **

    for skillDetail in skillDB {
        if Int(skillDetail.value) == 0 {
            continue
        } else {
            try! csv.write(row: [empSelectionLabel.text!, skillDetail.key, skillDetail.value])
            csv.stream.close()
        }
    }

Can this tool encodeing Chinese in CSV ?

I use the tool to read the English is CSV perfectly! But When I input the Chinese word in to the csv file, and do the same thing, I just get the "" nil string when go through Chinese word.

So Can this tool encoding Chinese, thank you

can the file path be written in URL instead of string ?

    let itemList = objects.dataName
    let fileManager = FileManager.default
    do {
        let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let stream = OutputStream(toFileAtPath: documentDirectory.appendingPathComponent(<#T##pathComponent: String##String#>), append: false)
        let csv = try! CSVWriter(stream: stream!)
        try! csv.write(row: ["name", "x", "y", "width", "height"])
        for _ in 0..<(itemList.count-1) {
            try! csv.write(row: [String(describing: objects.dataName.last), String(describing: objects.dataX.last), String(describing: objects.dataY.last), String(describing: objects.boundingX.last), String(describing: objects.boundingY.last)])
        }
                csv.stream.close()
    } catch {
        print("oops something went wrong")
    }

something right this? because I want to create a new file's name for every .csv save files

Error while decoding

I get the following error when I tired decoding
Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "_id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "_id", intValue: nil) ("_id").", underlyingError: nil)):

Strange output?

For the most part this library works great! But I'm encountering some strange things when iterating over a parsed CSV in my unit tests. Sometimes the parsing seems to fail and the values are populated with goggly goop like this column value of \0\0\0è�ä\u{05}\0\0\0\0\0\0\0\0\0\0\0\0\0�+\u{07}\u{01}\0\0\0�Ø.

Not sure if anyone else has encounter this, I haven't been able to figure out any sort of patter as to why it is happening.

Creating multiple headers

Is there a way to create multiple header?I am trying to convert four tables into CSV which are separated by "table name" which should be header field and hence I need to create four headers

dyld : library not loaded @rpath/CSV.framework/CSV

Yesterday I updated IOS version of my phone. It's 13.3.1 now, CSV.swift pod was working fine before updating. After upgrading i'm getting this issue
Reason: no suitable image found. Did find:
/private/var/containers/Bundle/Application/FD3A7DFA-DF11-4C42-B1CF-7429C5C27F11/TrackerConfiguration.app/Frameworks/CSV.framework/CSV: code signature invalid for '/private/var/containers/Bundle/Application/FD3A7DFA-DF11-4C42-B1CF-7429C5C27F11/TrackerConfiguration.app/Frameworks/CSV.framework/CSV'
I've tried alot of possible solutions
1- making it optional
2- integrate and reinstall later
3- Xcode restart , uninstall app , clean build etc.
but issue is still there. It is working fine on simulator . Any help would be appreciated

pod 'CSV.swift', '~> 2.2.1'

causes

[!] CocoaPods could not find compatible versions for pod "CSV.swift":
In Podfile:
CSV.swift (~> 2.2.1)

None of your spec sources contain a spec satisfying the dependency: CSV.swift (~> 2.2.1).

Skip Comma in Date

Is there anyway to avoid the comma in a date, for example jan 8, 2007 so that it puts the whole date in one cell instead of two cells? Something to ignore the comma?

Build error in Xcode 11

I get the following build error in Xcode 11.

sed: ./Pods/CSV.swift: in-place editing only works for regular files
Command PhaseScriptExecution failed with a nonzero exit code

Exported files can't be imported back

Hi,

My app exports CSV files to the iCloud Drive.
The user should be able to import the exported CSV files right back into the app.

Unfortunately the reimporting doesn't work. My app is not shown in the "open in"-dialogue.

I have used following Document Types:
image

Other CSVs from other sources do show my app in the dialogue.

Is there something wrong or something else to do within the export?

Part of my code looks like this:

    let fileManager = FileManager.default
    let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileName = automaticBackup ? "automaticBackup.csv" : "Transactions_\(String(Date().timeIntervalSince1970).dropLast(6)).csv"
    let csvFile = documentDirectory.appendingPathComponent(fileName)
    let stream = OutputStream(url: csvFile, append: false)
    
    do {
        let csv = try CSVWriter(stream: stream!)
        try csv.write(row: ["Date", "Type", "Market", "From Quantity", "From Value", "Currency", "To Quantity", "To Value", "Fee", "Note"])
        
        for transaction in transactions {
            let date = CPDateFormatter.cpCSVDateFormatter.string(from: transaction.dateAsDate)
            let type = transaction.transactionType.csvTitle
            
            let fromCoin = CoinHelper.coinFromId(id: transaction.fromCoinId)
            let toCoin = CoinHelper.coinFromId(id: transaction.toCoinId)
            let note = transaction.note ?? ""
            switch transaction.transactionType {
            case .COIN:
                guard let fromCoin = fromCoin?.symbol,
                    let toCoin = toCoin?.symbol,
                    let toQuantity = transaction.toQuantity else { continue }
                let market = "\(fromCoin)-\(toCoin)"
                try csv.write(row: [date, type, market, transaction.fromCoinQuantity.formattedAsBTCPrice, "", "", String(toQuantity), "", note])
            case .MONEY:
                guard let market = toCoin?.symbol,
                    let toQuantity = transaction.toQuantity else { continue }
                try csv.write(row: [date, type, market, "", String(transaction.fromInvestedMoney), transaction.currencyId, String(toQuantity), "", String(transaction.toCoinFeePercentage), note])
            case .WITHDRAWAL:
                guard let market = fromCoin?.symbol else { continue }
                try csv.write(row: [date, type, market, transaction.fromCoinQuantity.formattedAsBTCPrice, "", transaction.currencyId, "", String(transaction.fromInvestedMoney), "", note])
            }
        }
        
        let data = [UInt8](csv.configuration.newline.utf8)
        csv.stream.write(data, maxLength: data.count)
        
        csv.stream.close()
    } catch _ {
        completion(Localization.Alerts.csvExportError.localized)
        return
    }

Thanks in advance.

Cheers,
Nini

CSV.CSVError error 1

I get this error when I am trying to parse csv file on iOS device.
but when I am trying to parse the same csv file on Mac app it's works.

What can be the problem?

linux not build

How to avoid mistakes?
/swift/lib/CSV.swift/Sources/CSV/CSVReader+Decodable.swift:345:31: error: use of unresolved identifier 'kCFBooleanTrue'
if number === kCFBooleanTrue as NSNumber {
^~~~~~~~~~~~~~
/swift/lib/CSV.swift/Sources/CSV/CSVReader+Decodable.swift:347:38: error: use of unresolved identifier 'kCFBooleanFalse'
} else if number === kCFBooleanFalse as NSNumber {

Writing to stream with Xcode 10 and 2.3.1 is failing with strange error.

It gets through 20 or so lines, and then dies with this error:
writeScalar ((UnicodeScalar) throws -> Void) 0x000000010d97b4f0 CSV'partial apply forwarder for closure #1 (Swift.Unicode.Scalar) throws -> () in CSV.CSVWriter.init<A where A: Swift.UnicodeCodec, A.CodeUnit == Swift.UInt8>(stream: __C.NSOutputStream, codecType: A.Type, delimiter: Swift.String, newline: CSV.CSVWriter.Newline) throws -> CSV.CSVWriter at <compiler-generated>

I'm currently poking around the interwebs to see what the issue is. But I've debugged the data I'm outputting, and it looks fine. I'm basically merging two csv's here, pulling lines from each file and stuffing them into a merged file.

Add NilDecodingStrategy option

I have a CSV file that never contains an empty column, but instead an empty string.
Other files could have "null" values.

Would be cool to define a custom closure to decode to nil.
My proposal would look like this

enum NilDecodingStrategy {
    case default
    case emptyString // nil value: ""
    case null // nil value: "null" or null
    case custom((String) -> (_ isNil: Bool))
}

let decoder = CSVRowDecoder()
decoder.nilDecodingStrategy = .emptyString

Date decoding causes memory leak

This code causes a memory leak.

struct DecodableExample: Decodable {
    let dateKey: Date
    let stringKey: String
    let optionalStringKey: String?
}
[test.txt](https://github.com/yaslab/CSV.swift/files/2708834/test.txt)


for i in 1...20 {
    var records = [DecodableExample]()
    var ii = 0
    do {
        let csv = try String(contentsOfFile: "/tmp/test.txt", encoding: .utf8)
        let reader = try CSVReader(string: csv, hasHeaderRow: true, trimFields: true, delimiter: ";", whitespaces: .whitespaces)
        let decoder = CSVRowDecoder()
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        decoder.dateDecodingStrategy = .formatted(formatter)
        while reader.next() != nil {
            ii += 1
            let row = try decoder.decode(DecodableExample.self, from: reader)
            records.append(row)
        }
    } catch {
        print("\(ii)-\(error)")
    }
    print(i)
}

This code causes a fatal error.

import Foundation
import CSV

struct Product:Codable {
    var title:String
    var price:Int
    var quantity:Int
}

let csv = """
title,price,quantity
Nike 10 12
Adidas,11,13
"""
do {
    let reader = try CSVReader(string: csv, hasHeaderRow: true)
    let decoder = CSVRowDecoder()
    while reader.next() != nil {
        let product = try decoder.decode(Product.self, from: reader)
        print("\(product)")
    }
} catch {
    print(error)
}

About .xlsx format ...

Do you have any plans to support reading and writing .xlsx or .xlsx convert .csv ?

Thanks !

character escaping?

I have a string that contains colons "Monday, September 17, 2018 at 19:35 PM" which is supposed to be stored into a single column. When exported using CSV...
csvWriter.write(row: [dateString]) I obtain 3 columns instead of 1.

Is there an option that we have to enable to do automatic string escaping? What about being able to add quotes around string columns?

GCD Support for Large Files?

Any way to speed this up with GCD? I have a CSV with 50k+ rows that I need to crunch through and just incrementing a counter takes about 45 seconds on my iPad.

// Time began:
let startTime = Date()

// Read the CSV file:
let filePath = Bundle.main.path(forResource: "foo", ofType: "csv")
let stream = InputStream(fileAtPath: filePath!)
let csv = try! CSVReader(stream: stream!, hasHeaderRow: true)

// Count the rows:
var counter = 0
while csv.next() != nil {
    counter += 1
}

// Check the results:
print("Rows: \(counter)")
print("Elapsed time: \(startTime.timeIntervalSinceNow) seconds")
Output:
Rows: 52229
Elapsed time: -46.1442109942436 seconds

Possibility to specify characters to ignore while reading the file

Sometimes, CSV files are formatted in a way that they stay well human readable, for example with a delimiter character followed by a tabstop.
Would it be possible to integrate a functionality to ignore, for example, all \t in the input stream?
I know that I can preprocess my CSV files to achieve the same, but this cannot always be ensured for other users of the software.

Use with Alamofire?

Is it possible to combine these 2 frameworks?

CSV.swift seems to need an InputStream data type, which I don't know how to find, use or manipulate Alamofire...

new row with for loop

is it possible ? I want to save a new data on the new row which can not prepare beforehand

something like:

let stream = OutputStream(url: csvFile!, append: false) let csv = try! CSVWriter(stream: stream!) try! csv.write(row: ["name", "x", "y", "width", "height"]) for _ in stride(from: 0, to: itemList.count, by: 1) { try! csv.write(row: [String(describing: objects.dataName.last ?? ""), String(describing: objects.dataX.last ?? 0), String(describing: objects.dataY.last ?? 0), String(describing: objects.boundingX.last ?? 0), String(describing: objects.boundingY.last ?? 0)]) }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.