typestar

lines.go en Go

Contar líneas, palabras y bytes como wc, para archivos o stdin.

// Cuenta líneas, palabras y bytes de archivos o stdin, como wc.
package main

import (
    "bufio"
    "fmt"
    "os"
)

type counts struct {
    lines, words, bytes int
}

func count(r *bufio.Reader) counts {
    var c counts
    scanner := bufio.NewScanner(r)
    for scanner.Scan() {
        line := scanner.Text()
        c.lines++
        c.bytes += len(line) + 1
        inWord := false
        for _, ch := range line {
            if ch == ' ' || ch == '\t' {
                inWord = false
            } else if !inWord {
                inWord = true
                c.words++
            }
        }
    }
    return c
}

func main() {
    args := os.Args[1:]
    if len(args) == 0 {
        c := count(bufio.NewReader(os.Stdin))
        fmt.Printf("%8d %8d %8d\n", c.lines, c.words, c.bytes)
        return
    }

    var total counts
    for _, name := range args {
        f, err := os.Open(name)
        if err != nil {
            fmt.Fprintf(os.Stderr, "skip %s: %v\n", name, err)
            continue
        }
        c := count(bufio.NewReader(f))
        f.Close()
        fmt.Printf("%8d %8d %8d %s\n", c.lines, c.words, c.bytes, name)
        total.lines += c.lines
        total.words += c.words
        total.bytes += c.bytes
    }
    if len(args) > 1 {
        fmt.Printf("%8d %8d %8d total\n", total.lines, total.words, total.bytes)
    }
}

Cómo funciona

  1. bufio.Scanner lee línea por línea.
  2. Un contador de palabras detecta las transiciones a palabra.
  3. Con varios archivos también imprime una fila de total.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
59
Caracteres a escribir
1041
Tokens
295
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 169 segundos.

Escribe este fragmento

Paso 1 de 1 en Bis; paso 30 de 30 en Fundamentos del lenguaje.

← Anterior