├── .gitignore ├── LICENSE.txt ├── README.md ├── bridges.rb ├── csv2json ├── csv2tsv ├── eq2tsv ├── fmt2tsv ├── gs2tsv ├── html2tsv ├── hwrap ├── json2tsv ├── json2tsv_testdata ├── 30lines_bad_json.txt └── 30lines_bad_ws.txt ├── lamecut ├── namecut ├── sas2tsv ├── ssv2tsv ├── tabawk ├── tabsort ├── tar2tsv ├── test ├── test.py └── tsvcat1 │ ├── a1 │ ├── a2 │ ├── out.rename │ └── out.simple ├── tsv2csv ├── tsv2fmt ├── tsv2html ├── tsv2json ├── tsv2my ├── tsv2ssv ├── tsv2tex ├── tsv2yaml ├── tsvawk ├── tsvcat ├── tsvsort ├── tsvutil.py ├── uniq2tsv ├── xls2csvfiles ├── xls2tsv ├── xlsx2tsv ├── xlsx_test ├── ragged.xlsx ├── s.xml └── ss.xml └── yaml2tsv /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | bridges/ 3 | BRIDGES_BELOW 4 | csv2csv 5 | csv2fmt 6 | csv2html 7 | csv2my 8 | csv2tex 9 | csv2ssv 10 | eq2csv 11 | eq2fmt 12 | eq2html 13 | eq2my 14 | eq2tex 15 | eq2ssv 16 | json2csv 17 | json2fmt 18 | json2html 19 | json2my 20 | json2tex 21 | json2ssv 22 | ssv2csv 23 | ssv2fmt 24 | ssv2html 25 | ssv2my 26 | ssv2tex 27 | ssv2ssv 28 | uniq2csv 29 | uniq2fmt 30 | uniq2html 31 | uniq2my 32 | uniq2tex 33 | uniq2ssv 34 | xlsx2csv 35 | xlsx2fmt 36 | xlsx2html 37 | xlsx2my 38 | xlsx2tex 39 | xlsx2ssv 40 | yaml2csv 41 | yaml2fmt 42 | yaml2html 43 | yaml2my 44 | yaml2tex 45 | yaml2ssv 46 | fmt2csv 47 | fmt2fmt 48 | fmt2html 49 | fmt2my 50 | fmt2tex 51 | fmt2ssv 52 | csv2csv 53 | csv2fmt 54 | csv2html 55 | csv2my 56 | csv2tex 57 | csv2ssv 58 | eq2csv 59 | eq2fmt 60 | eq2html 61 | eq2my 62 | eq2tex 63 | eq2ssv 64 | json2csv 65 | json2fmt 66 | json2html 67 | json2my 68 | json2tex 69 | json2ssv 70 | ssv2csv 71 | ssv2fmt 72 | ssv2html 73 | ssv2my 74 | ssv2tex 75 | ssv2ssv 76 | uniq2csv 77 | uniq2fmt 78 | uniq2html 79 | uniq2my 80 | uniq2tex 81 | uniq2ssv 82 | xlsx2csv 83 | xlsx2fmt 84 | xlsx2html 85 | xlsx2my 86 | xlsx2tex 87 | xlsx2ssv 88 | yaml2csv 89 | yaml2fmt 90 | yaml2html 91 | yaml2my 92 | yaml2tex 93 | yaml2ssv 94 | fmt2csv 95 | fmt2fmt 96 | fmt2html 97 | fmt2my 98 | fmt2tex 99 | fmt2ssv 100 | csv2csv 101 | csv2fmt 102 | csv2html 103 | csv2my 104 | csv2tex 105 | csv2ssv 106 | eq2csv 107 | eq2fmt 108 | eq2html 109 | eq2my 110 | eq2tex 111 | eq2ssv 112 | json2csv 113 | json2fmt 114 | json2html 115 | json2my 116 | json2tex 117 | json2ssv 118 | ssv2csv 119 | ssv2fmt 120 | ssv2html 121 | ssv2my 122 | ssv2tex 123 | ssv2ssv 124 | uniq2csv 125 | uniq2fmt 126 | uniq2html 127 | uniq2my 128 | uniq2tex 129 | uniq2ssv 130 | xlsx2csv 131 | xlsx2fmt 132 | xlsx2html 133 | xlsx2my 134 | xlsx2tex 135 | xlsx2ssv 136 | yaml2csv 137 | yaml2fmt 138 | yaml2html 139 | yaml2my 140 | yaml2tex 141 | yaml2ssv 142 | fmt2csv 143 | fmt2fmt 144 | fmt2html 145 | fmt2my 146 | fmt2tex 147 | fmt2ssv 148 | csv2csv 149 | csv2fmt 150 | csv2html 151 | csv2my 152 | csv2tex 153 | csv2ssv 154 | eq2csv 155 | eq2fmt 156 | eq2html 157 | eq2my 158 | eq2tex 159 | eq2ssv 160 | json2csv 161 | json2fmt 162 | json2html 163 | json2my 164 | json2tex 165 | json2ssv 166 | ssv2csv 167 | ssv2fmt 168 | ssv2html 169 | ssv2my 170 | ssv2tex 171 | ssv2ssv 172 | uniq2csv 173 | uniq2fmt 174 | uniq2html 175 | uniq2my 176 | uniq2tex 177 | uniq2ssv 178 | xlsx2csv 179 | xlsx2fmt 180 | xlsx2html 181 | xlsx2my 182 | xlsx2tex 183 | xlsx2ssv 184 | yaml2csv 185 | yaml2fmt 186 | yaml2html 187 | yaml2my 188 | yaml2tex 189 | yaml2ssv 190 | fmt2csv 191 | fmt2fmt 192 | fmt2html 193 | fmt2my 194 | fmt2tex 195 | fmt2ssv 196 | csv2csv 197 | csv2fmt 198 | csv2html 199 | csv2my 200 | csv2tex 201 | csv2ssv 202 | eq2csv 203 | eq2fmt 204 | eq2html 205 | eq2my 206 | eq2tex 207 | eq2ssv 208 | json2csv 209 | json2fmt 210 | json2html 211 | json2my 212 | json2tex 213 | json2ssv 214 | ssv2csv 215 | ssv2fmt 216 | ssv2html 217 | ssv2my 218 | ssv2tex 219 | ssv2ssv 220 | uniq2csv 221 | uniq2fmt 222 | uniq2html 223 | uniq2my 224 | uniq2tex 225 | uniq2ssv 226 | xlsx2csv 227 | xlsx2fmt 228 | xlsx2html 229 | xlsx2my 230 | xlsx2tex 231 | xlsx2ssv 232 | yaml2csv 233 | yaml2fmt 234 | yaml2html 235 | yaml2my 236 | yaml2tex 237 | yaml2ssv 238 | fmt2csv 239 | fmt2fmt 240 | fmt2html 241 | fmt2my 242 | fmt2tex 243 | fmt2ssv 244 | csv2csv 245 | csv2fmt 246 | csv2html 247 | csv2my 248 | csv2tex 249 | csv2ssv 250 | eq2csv 251 | eq2fmt 252 | eq2html 253 | eq2my 254 | eq2tex 255 | eq2ssv 256 | json2csv 257 | json2fmt 258 | json2html 259 | json2my 260 | json2tex 261 | json2ssv 262 | ssv2csv 263 | ssv2fmt 264 | ssv2html 265 | ssv2my 266 | ssv2tex 267 | ssv2ssv 268 | uniq2csv 269 | uniq2fmt 270 | uniq2html 271 | uniq2my 272 | uniq2tex 273 | uniq2ssv 274 | xlsx2csv 275 | xlsx2fmt 276 | xlsx2html 277 | xlsx2my 278 | xlsx2tex 279 | xlsx2ssv 280 | yaml2csv 281 | yaml2fmt 282 | yaml2html 283 | yaml2my 284 | yaml2tex 285 | yaml2ssv 286 | fmt2csv 287 | fmt2fmt 288 | fmt2html 289 | fmt2my 290 | fmt2tex 291 | fmt2ssv 292 | csv2csv 293 | csv2fmt 294 | csv2html 295 | csv2my 296 | csv2tex 297 | csv2ssv 298 | eq2csv 299 | eq2fmt 300 | eq2html 301 | eq2my 302 | eq2tex 303 | eq2ssv 304 | json2csv 305 | json2fmt 306 | json2html 307 | json2my 308 | json2tex 309 | json2ssv 310 | ssv2csv 311 | ssv2fmt 312 | ssv2html 313 | ssv2my 314 | ssv2tex 315 | ssv2ssv 316 | uniq2csv 317 | uniq2fmt 318 | uniq2html 319 | uniq2my 320 | uniq2tex 321 | uniq2ssv 322 | xlsx2csv 323 | xlsx2fmt 324 | xlsx2html 325 | xlsx2my 326 | xlsx2tex 327 | xlsx2ssv 328 | yaml2csv 329 | yaml2fmt 330 | yaml2html 331 | yaml2my 332 | yaml2tex 333 | yaml2ssv 334 | fmt2csv 335 | fmt2fmt 336 | fmt2html 337 | fmt2my 338 | fmt2tex 339 | fmt2ssv 340 | csv2csv 341 | csv2fmt 342 | csv2html 343 | csv2my 344 | csv2tex 345 | eq2csv 346 | eq2fmt 347 | eq2html 348 | eq2my 349 | eq2tex 350 | json2csv 351 | json2fmt 352 | json2html 353 | json2my 354 | json2tex 355 | ssv2csv 356 | ssv2fmt 357 | ssv2html 358 | ssv2my 359 | ssv2tex 360 | uniq2csv 361 | uniq2fmt 362 | uniq2html 363 | uniq2my 364 | uniq2tex 365 | xlsx2csv 366 | xlsx2fmt 367 | xlsx2html 368 | xlsx2my 369 | xlsx2tex 370 | yaml2csv 371 | yaml2fmt 372 | yaml2html 373 | yaml2my 374 | yaml2tex 375 | fmt2csv 376 | fmt2fmt 377 | fmt2html 378 | fmt2my 379 | fmt2tex 380 | csv2csv 381 | csv2fmt 382 | csv2html 383 | csv2my 384 | csv2tex 385 | eq2csv 386 | eq2fmt 387 | eq2html 388 | eq2my 389 | eq2tex 390 | json2csv 391 | json2fmt 392 | json2html 393 | json2my 394 | json2tex 395 | ssv2csv 396 | ssv2fmt 397 | ssv2html 398 | ssv2my 399 | ssv2tex 400 | uniq2csv 401 | uniq2fmt 402 | uniq2html 403 | uniq2my 404 | uniq2tex 405 | xlsx2csv 406 | xlsx2fmt 407 | xlsx2html 408 | xlsx2my 409 | xlsx2tex 410 | yaml2csv 411 | yaml2fmt 412 | yaml2html 413 | yaml2my 414 | yaml2tex 415 | fmt2csv 416 | fmt2fmt 417 | fmt2html 418 | fmt2my 419 | fmt2tex 420 | csv2csv 421 | csv2fmt 422 | csv2html 423 | csv2my 424 | csv2tex 425 | eq2csv 426 | eq2fmt 427 | eq2html 428 | eq2my 429 | eq2tex 430 | json2csv 431 | json2fmt 432 | json2html 433 | json2my 434 | json2tex 435 | ssv2csv 436 | ssv2fmt 437 | ssv2html 438 | ssv2my 439 | ssv2tex 440 | uniq2csv 441 | uniq2fmt 442 | uniq2html 443 | uniq2my 444 | uniq2tex 445 | xlsx2csv 446 | xlsx2fmt 447 | xlsx2html 448 | xlsx2my 449 | xlsx2tex 450 | yaml2csv 451 | yaml2fmt 452 | yaml2html 453 | yaml2my 454 | yaml2tex 455 | csv2csv 456 | csv2fmt 457 | csv2html 458 | csv2my 459 | csv2tex 460 | eq2csv 461 | eq2fmt 462 | eq2html 463 | eq2my 464 | eq2tex 465 | json2csv 466 | json2fmt 467 | json2html 468 | json2my 469 | json2tex 470 | ssv2csv 471 | ssv2fmt 472 | ssv2html 473 | ssv2my 474 | ssv2tex 475 | uniq2csv 476 | uniq2fmt 477 | uniq2html 478 | uniq2my 479 | uniq2tex 480 | xlsx2csv 481 | xlsx2fmt 482 | xlsx2html 483 | xlsx2my 484 | xlsx2tex 485 | yaml2csv 486 | yaml2fmt 487 | yaml2html 488 | yaml2my 489 | yaml2tex 490 | csv2csv 491 | csv2fmt 492 | csv2html 493 | csv2my 494 | csv2tex 495 | eq2csv 496 | eq2fmt 497 | eq2html 498 | eq2my 499 | eq2tex 500 | json2csv 501 | json2fmt 502 | json2html 503 | json2my 504 | json2tex 505 | ssv2csv 506 | ssv2fmt 507 | ssv2html 508 | ssv2my 509 | ssv2tex 510 | uniq2csv 511 | uniq2fmt 512 | uniq2html 513 | uniq2my 514 | uniq2tex 515 | xlsx2csv 516 | xlsx2fmt 517 | xlsx2html 518 | xlsx2my 519 | xlsx2tex 520 | yaml2csv 521 | yaml2fmt 522 | yaml2html 523 | yaml2my 524 | yaml2tex 525 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016, Brendan T. O'Connor (http://brenocon.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | tsvutils -- utilities for processing tab-separated files 2 | ======================================================== 3 | 4 | *tsvutils* are scripts that can convert and manipulate tabular data in the TSV file format: tab-separated values, sometimes with a header. They build on top of standard Unix utilities to allow ad-hoc, efficient, and reliable processing and summarization of tabular data from the shell. 5 | 6 | Overview of scripts 7 | ------------------- 8 | 9 | Convert into tsv: 10 | 11 | * csv2tsv - convert from Excel-compatible csv. 12 | * json2tsv - convert from concatenated JSON records. 13 | * xlsx2tsv - convert from Excel's .xlsx format. 14 | * others: eq2tsv ssv2tsv uniq2tsv yaml2tsv ... 15 | 16 | Manipulate tsv: 17 | 18 | * tsvawk - gives you column names in your awk. 19 | * hwrap - wraps pipeline process but preserves stdin's header. 20 | * tsvcat - concatenate tsv's, aligning common columns. 21 | * namecut - like 'cut' but with header names. 22 | * tabsort, tabawk - wrappers for tab delimitation. 23 | 24 | Convert out of tsv: 25 | 26 | * tsv2csv - convert tsv to Excel-compatible csv. 27 | * tsv2my - load tsv into a new MySQL table. 28 | * tsv2fmt - format as ASCII-art table. 29 | * tsv2html - format as HTML table. 30 | * others: tsv2yaml tsv2tex ... 31 | 32 | By "tsv" we mean honest-to-goodness tab-separated values, often with a header. No quoting, escaping, or comments. All rows should have the same number of fields. Rows end with a unix \n newline. Cell values cannot have tabs or newlines. 33 | 34 | These conditions are all enforced in scripts that output tsv. For programs that take tsv input, if these assumptions do not hold, the script's behavior is undefined. 35 | 36 | TSV is an easy format for other programs to handle: 37 | 38 | * After stripping the newline, split("\t") correctly parses a row. 39 | * To strip out the header beforehand: "tail -n+2" or "tail +2". 40 | 41 | Weak naming convention: programs that don't work well with headers call that format "tab"; ones that either need a header or are agnostic call that "tsv". E.g., for tabsort you don't want to sort the header, but tsv2my is impossible without the header. csv2tsv and tsv2csv are agnostic, since a csv file may or may not have a header. 42 | 43 | 44 | Examples: pipelines 45 | ------------------- 46 | 47 | The TSV format is intended to work with many other pipeline-friendly programs. Examples include: 48 | 49 | * General 50 | - cat, head, tail, tail -n+X, cut, merge, diff, comm, sort, uniq, uniq -c, wc -l 51 | * Multipurpose 52 | - perl -pe, ruby -ne, awk, sed, tr 53 | * SQL to TSV 54 | - echo 'select a,b from bla' | mysql 55 | - echo a b | ssv2tsv; echo "select a,b from bla" | sqlite3 -separator $(echo -e '\t') 56 | - echo a b | ssv2tsv; echo "select a,b from bla" | psql -tqAF $(echo -e '\t') 57 | * GUI to TSV 58 | - Excel: copy-and-paste cells <-> text as tsv (though kills double quotes) 59 | - Web browsers: copy rendered HTML table -> text as tsv 60 | * Misc 61 | - [pv][] (Highly recommended!) 62 | - [shuffle][] 63 | - [md5sort][] 64 | - [setdiff][] 65 | 66 | The tsvutils scripts' comments include further examples. 67 | 68 | 69 | [shuffle]: http://www.w3.org/People/Bos/Shuffle 70 | [md5sort]: http://gist.github.com/22959 71 | [setdiff]: http://gist.github.com/22958 72 | [pv]: http://www.ivarch.com/programs/pv.shtml 73 | 74 | 75 | Examples: Named columns in programs 76 | ----------------------------------- 77 | 78 | Here are examples of parsing TSV-with headers in several script-y languages, such that you get to refer to columns by their names, instead of positions. This makes the scripts much more maintainable. 79 | 80 | _Python_ has a built-in facility for TSV-with-headers: 81 | 82 | tsv_reader = lambda f: csv.DictReader(f, dialect=None, delimiter='\t', quoting=csv.QUOTE_NONE) 83 | for record in tsv_reader(sys.stdin): 84 | print record # => hash of key/values 85 | 86 | Or equivalently: 87 | 88 | cols = sys.stdin.readline()[:-1] 89 | for line in sys.stdin: 90 | vals = line[:-1].split("\t") 91 | record = dict((cols[j],vals[j]) for j in range(len(cols))) 92 | print record # => hash of key/values 93 | 94 | _Ruby_: 95 | 96 | cols = STDIN.readline.chomp.split("\t") 97 | STDIN.each do |line| 98 | vals = line.chomp.split("\t") 99 | record = (0...cols.size).map {|j| [cols[j], vals[j]]}.to_h 100 | p record # => hash of key/values 101 | end 102 | 103 | 104 | _R_ has a built-in facility: 105 | 106 | data = read.delim("data.tsv", sep="\t") 107 | 108 | 109 | Installation 110 | ------------ 111 | 112 | It's probably useful to look at or tweak these scripts, so you're best off just putting the entire directory on your PATH. 113 | 114 | 115 | The philosophy of tsvutils 116 | -------------------------- 117 | 118 | There are many data processing and analysis situations where data consists of tables. A "table" is a list of flat records each with the same set of named attributes, where it's easy to manipulate a particular attribute across all records -- a "column". The main data structures in SQL, R, and Excel are tables. 119 | 120 | TSV-with-headers sits in a sweet spot on the spectrum of data format complexity. 121 | 122 | - A more complex alternative is to encode in arbitrarily nested structures (XML, JSON). These have greater representational capacity, but are less convenient for data analysis. Since they can have high structural complexity, it's often error-prone to use them -- ad-hoc querying is generally difficult. Furthermore, it's wasteful of space to repeat key names over and over if all records are known to have the same set of keys. Finally, when doing data analysis, especially statistical analysis, you want to turn columns into vectors, which presupposes a flatter, more table-like structure. 123 | - A simpler alternative is a table with positional, un-named columns. The main weakness is that for more than several columns, it's hard to remember which column is which. Named columns improve maintainability. 124 | 125 | But: SQL databases and Excel spreadsheets are often inconvenient data management environments compared to the filesystem on the unix commandline. Unfortunately, the most common file format for tables is CSV, which is complex and has several incompatible versions. It plays only moderately nicely with the unix commandline, which is the best ad-hoc processing tool for filesystem data. Often the only correct way to handle CSV is to use a parsing library, but it's inconvenient to fire up a python/perl/ruby session just to do simple sanity checks and casually inspect data. 126 | 127 | To balance these needs, so far I've found that TSV-with-headers is the most convenient canonical format for table data in the filesystem/commandline environment, or at least the lingua franca in shell pipelines. These utilities are just a little bit of glue to make TSV play nicely with CSV, Excel, MySQL, and Unix tools. Interfaces in and out of other table-centric environments could easily be added. 128 | 129 | On the philosophy of having NO escaping or special data value conventions: If you want those things in your data, make up your own convention (like backslash escaping, URL escaping, or whatever) and have your application be aware of it. Our philosophy is, a data processing utility should ignore that stuff in order to have safe and predictable behavior. I've seen too many bugs because some intermediate program imposed a special meaning on "NA" or "\N" or "NULL", etc., when really a program further downstream should have had sole responsibility for this interpretation. 130 | 131 | 132 | In Conclusion 133 | ------------- 134 | 135 | Hope you enjoy tsvutils! 136 | 137 | - tsvutils: http://github.com/brendano/tsvutils 138 | - By Brendan O'Connor: http://anyall.org 139 | -------------------------------------------------------------------------------- /bridges.rb: -------------------------------------------------------------------------------- 1 | # go through tsv as universal intermediary 2 | 3 | mode = ARGV[0] 4 | (mode=="clean" || mode=="make") or raise "Must give argument 'clean' or 'make'" 5 | 6 | $sources = %w(csv eq json ssv uniq xlsx yaml fmt) 7 | $dests = %w(csv fmt html my tex ssv) 8 | 9 | # do the options go to the right-side command, or left-side command? 10 | $opts_right = /.*2fmt/ 11 | 12 | system "mkdir -p bridges" 13 | 14 | def make_bridge_list() 15 | bridges = [] 16 | for s in $sources 17 | for d in $dests 18 | # next if s==d 19 | left = "#{s}2tsv" 20 | right = "tsv2#{d}" 21 | if File.exists?(left) && File.exists?(right) 22 | if "#{s}2#{d}" =~ $opts_right 23 | right = %|#{right} "$@"| 24 | else 25 | left = %|#{left} "$@"| 26 | end 27 | bridges << "#{s}2#{d}" 28 | end 29 | end 30 | end 31 | bridges 32 | end 33 | 34 | bridges = make_bridge_list() 35 | 36 | for bridge in bridges do 37 | s,d = bridge.split("2") 38 | left = "#{s}2tsv" 39 | right = "tsv2#{d}" 40 | 41 | if mode=="make" 42 | open("bridges/#{s}2#{d}","w") do |f| 43 | f.puts %[ 44 | #!/bin/sh 45 | #{left} | #{right} 46 | ].gsub(/^ */,"").strip 47 | end 48 | system "chmod +x bridges/#{s}2#{d}" 49 | system "ln -s bridges/#{s}2#{d} ." if !File.exists?("#{s}2#{d}") 50 | elsif mode=="clean" 51 | system "rm -f #{s}2#{d}" 52 | system "rm -f bridges/#{s}2#{d}" 53 | end 54 | end 55 | 56 | if mode=="make" 57 | gitignore = open(".gitignore").read 58 | gitignore.sub!(/BRIDGES_BELOW.*/, (["BRIDGES_BELOW"] + bridges).join("\n")) 59 | open(".gitignore",'w'){|f| f.puts gitignore } 60 | end 61 | -------------------------------------------------------------------------------- /csv2json: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | r""" 3 | Input is Excel-style CSV. Either stdin or filename. 4 | (We can handle Mac Excel's \r-delimited csv) 5 | Output is JSON records, one per line. 6 | """ 7 | 8 | #from __future__ import print_function 9 | import csv, sys, json 10 | 11 | args = sys.argv[:] 12 | args.pop(0) 13 | if len(args)==1: 14 | reader = csv.DictReader(open(args[0],'U')) 15 | #reader = csv.reader(codecs.open(args[0],'U','utf-8')) 16 | elif len(args) > 1: 17 | raise Exception("No support for multiple files yet") 18 | # could try to enforce conformity, or meld them together, etc. 19 | elif not sys.stdin.isatty(): 20 | reader = csv.DictReader(sys.stdin) 21 | else: 22 | print(__doc__.strip()) 23 | sys.exit(1) 24 | 25 | def decode(string): 26 | assert isinstance(string, str) and not isinstance(string, unicode) 27 | return string.decode("utf8", "replace") 28 | 29 | for record in reader: 30 | # Tricky. Want unicode objects. 31 | record = {decode(k):decode(v) for k,v in record.items()} 32 | # print record 33 | print json.dumps(record) 34 | -------------------------------------------------------------------------------- /csv2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | r""" 3 | Input is Excel-style CSV. Either stdin or filename. 4 | (We can handle Mac Excel's \r-delimited csv) 5 | Output is honest-to-goodness tsv: no quoting or any \n\r\t. 6 | """ 7 | 8 | #from __future__ import print_function 9 | import csv, sys 10 | 11 | from tsvutil import cell_text_clean, warning, UnicodeReader 12 | 13 | def clean_row(row): 14 | return [cell_text_clean(x) for x in row] 15 | 16 | args = sys.argv[:] 17 | args.pop(0) 18 | if len(args)==1: 19 | reader = csv.reader(open(args[0],'U')) 20 | #reader = csv.reader(codecs.open(args[0],'U','utf-8')) 21 | elif len(args) > 1: 22 | raise Exception("No support for multiple files yet") 23 | # could try to enforce conformity, or meld them together, etc. 24 | elif not sys.stdin.isatty(): 25 | reader = csv.reader(sys.stdin) 26 | else: 27 | print(__doc__.strip()) 28 | sys.exit(1) 29 | 30 | header = reader.next() 31 | print "\t".join(clean_row(header)).encode('utf8') 32 | #print(*clean_row(header), sep="\t") 33 | 34 | for row in reader: 35 | if len(row) < len(header): 36 | # warning("Row with %d values is too short; padding with %d blanks" % (len(row),len(header)-len(row))) 37 | row += [''] * (len(header) - len(row)) 38 | print "\t".join(clean_row(row)) 39 | -------------------------------------------------------------------------------- /eq2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # input lines are name=value pairs, with other crap strewn about, e.g. 4 | # 5 | # t=0 i=0 label=1 pred=1 6 | # blabla t=2 i=0 label=1 pred=0.999988 OMG!!! 7 | # t=1 i=1993 label=0 pred=0 8 | # t=1 i=1996 label=0 pred=9.16984e-06 9 | # 10 | # this is an easy debug format to output from a C program. 11 | # combined with grep, use this to get tables of useful event-like data 12 | 13 | class String 14 | def matches(regex) 15 | ret = [] 16 | scan(regex) do |match_groups| 17 | ret << $~ 18 | end 19 | ret 20 | end 21 | end 22 | 23 | class Regexp 24 | def matches(str) 25 | str.matches(self) 26 | end 27 | end 28 | 29 | def parse_line(line) 30 | # >> (/(\S+)=(\S+)/.matches("t=1 i=1996 label=0 pred=9.16984e-06"))[0][1..2] 31 | 32 | matches = /(\S*[a-zA-Z0-9])=(\S+)/.matches(line) 33 | ret = {} 34 | for m in matches 35 | k,v = m[1..2] 36 | ret[k] = v 37 | end 38 | ret 39 | 40 | end 41 | 42 | def puts_nas(n) 43 | puts( (["NA"]*n).join("\t") ) 44 | end 45 | 46 | names = nil 47 | buildup = 0 48 | 49 | for line in STDIN 50 | if line !~ /[a-zA-Z0-9]=\S/ 51 | next unless ARGV.member?('-a') 52 | if names.nil? 53 | buildup += 1 54 | else 55 | puts_nas(names.size) 56 | end 57 | next 58 | end 59 | 60 | record = parse_line(line.chomp) 61 | if names.nil? 62 | names = record.keys.sort 63 | puts names.join("\t") 64 | buildup.times { puts_nas(names.size) } 65 | end 66 | puts names.map{|k| record[k]}.join("\t") 67 | end 68 | 69 | -------------------------------------------------------------------------------- /fmt2tsv: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Converts out of the pipe-delimited (and whitespace-padded) format 3 | # from 'tsv2fmt'. 4 | # The existence of this script at all is kinda silly but sometimes useful. 5 | perl -pe 's/^\| *//g; s/ *\|$//; s/ *\| */\t/g' 6 | -------------------------------------------------------------------------------- /gs2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | 3 | """ 4 | gs2tsv SpreadSheetID ...columns... 5 | 6 | Pull out columns from a Google Spreadsheet as TSV. 7 | You have to have column names in your spreadsheet. 8 | SpreadSheetID is big long key looking like: 9 | 0As_fJj-ffTmBdEp4T2FNNWxnZU53ZXVKR1dLSDc0N0E 10 | 11 | What's a secure way of storing your Google username/password? 12 | This script uses ROT-13 of the file ~/.google_pw ... 13 | """ 14 | 15 | # oh god i hate this api. so much b.s. just give me the damn data please 16 | # http://code.google.com/apis/spreadsheets/data/1.0/developers_guide_python.html#AuthClientLogin 17 | from __future__ import with_statement 18 | import xml.etree.ElementTree as ET ## tree = ET.parse(open("bla.xml")) 19 | import sys,os 20 | import gdata.spreadsheet.service 21 | 22 | key = sys.argv[1] # e.g. big long thing 23 | worksheet = 1 24 | 25 | column_names = sys.argv[2:] 26 | assert column_names, "need to specify columns to fetch" 27 | 28 | c=gdata.spreadsheet.service.SpreadsheetsService() 29 | c.email,c.password=os.popen("tr 'A-Za-z' 'N-ZA-Mn-za-m' < ~/.google_pw").read().split() 30 | c.ProgrammaticLogin() 31 | s=c.Get("http://spreadsheets.google.com/feeds/list/%s/%s/private/full" % (key,worksheet)) 32 | string=s.ToString() 33 | # with open("bla.xml",'w') as f: f.write(string) 34 | xt=ET.fromstring(string) 35 | 36 | n=lambda e: "{http://schemas.google.com/spreadsheets/2006/extended}%s" % e 37 | column_data = [ 38 | [e.text or "" for e in xt.findall(".//" + n(column_name))] 39 | for column_name in column_names 40 | ] 41 | 42 | 43 | ncol = len(column_data) 44 | nrow = len(column_data[0]) 45 | 46 | assert all(nrow == len(column) for column in column_data), "returned column data doesnt seem to be parallel. num rows by column: %s" % [len(c) for c in column_data] 47 | 48 | warning_count=0 49 | warning_max = 20 50 | def warning(s): 51 | global warning_count 52 | warning_count += 1 53 | if warning_count > warning_max: return 54 | print>>sys.stderr, "WARNING: %s" % s 55 | 56 | def cell_text_clean(text): 57 | s = text 58 | if isinstance(s,str): 59 | s = unicode(s, 'utf8', 'replace') 60 | #print repr(text) 61 | #s = unicode(text,'utf8','replace') 62 | #s = unicode(text,'utf8') 63 | if "\t" in s: warning("Clobbering embedded tab") 64 | if "\n" in s: warning("Clobbering embedded newline") 65 | if "\r" in s: warning("Clobbering embedded carriage return") 66 | s = s.replace("\t"," ").replace("\n"," ").replace("\r"," ") 67 | return s 68 | 69 | 70 | sys.stdout.write("\t".join(column_names) + "\n") 71 | for i in range(nrow): 72 | sys.stdout.write( "\t".join(cell_text_clean(column_data[j][i]) for j in range(ncol)) ) 73 | sys.stdout.write("\n") 74 | 75 | 76 | if warning_count > warning_max: 77 | print>>sys.stderr, "%d total warnings, %d hidden" % (warning_count, warning_count-warning_max) 78 | -------------------------------------------------------------------------------- /html2tsv: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | grep -v '^' | perl -pe 's|^\||; s|^\||; s|\|\t|g' 3 | -------------------------------------------------------------------------------- /hwrap: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | hwrap [pipeline command to wrap] 4 | 5 | Assume stdin has a header and the rest are rows. 6 | Print header, then pass on only the rows to wrapped command's stdin. 7 | Examples: 8 | 9 | cat file_with_header.tsv | hwrap tabsort -k3 10 | cat file_with_header.tsv | hwrap tail 11 | cat file_with_header.tsv | hwrap grep bla 12 | cat file_with_header.tsv | hwrap bash -c "grep bla | head" 13 | """ 14 | 15 | import sys,os,subprocess 16 | 17 | if sys.stdin.isatty(): 18 | print>>sys.stderr, __doc__.strip() 19 | sys.exit(1) 20 | sys.stdin = open('/dev/stdin','U',buffering=0) 21 | sys.stdout = open('/dev/stdout','w',buffering=0) 22 | header = sys.stdin.readline() 23 | print header[:-1] 24 | args = sys.argv[1:] 25 | subprocess.call(args, stdin=sys.stdin, stdout=sys.stdout) 26 | -------------------------------------------------------------------------------- /json2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | Convert a stream of JSON objects to TSV, extracting the keys 4 | you specify into columns. 5 | 6 | If you don't specify any keys, it tries to figure out the set of all keys. 7 | """ 8 | 9 | import json as jsonmod 10 | try: 11 | exec "import ujson as jsonmod" 12 | except ImportError: 13 | pass 14 | 15 | import sys,re,itertools 16 | 17 | #all_json = jsonmod.load(sys.stdin) 18 | #assert isinstance(all_json, list) and len(all_json)>0 19 | #item1 = json[0] 20 | #keys = items1.keys() 21 | #keys.sort() 22 | #json_iter = all_json 23 | 24 | def safe_json_iter(raw_json_iter): 25 | for raw in raw_json_iter: 26 | try: 27 | data = jsonmod.loads(raw) 28 | yield data 29 | except Exception, e: 30 | pass 31 | # print>>sys.stderr, type(e), e 32 | # print>>sys.stderr, repr(raw) 33 | 34 | def take(n, iterable): 35 | "Return first n items of the iterable as a list" 36 | return list(itertools.islice(iterable, n)) 37 | 38 | def order_keys(keys, item_sample): 39 | # Some heuristics that may or may not help 40 | from collections import defaultdict 41 | types = defaultdict(list) 42 | lengths = defaultdict(list) 43 | mid = int(len(item_sample)/2) 44 | def median(L): return L[mid] 45 | 46 | for item in item_sample: 47 | for key in keys: 48 | value = item[key] 49 | types[key].append(type(value)) 50 | if isinstance(value, unicode): 51 | lengths[key].append(len(value)) 52 | lengths = dict((k, 0 if not L else median(L)) for (k,L) in lengths.items()) 53 | # types = dict((k,tsvutil.mode(L)) for k,L in types.items()) 54 | types = dict((k,L[0]) for k,L in types.items()) 55 | prios = [ 56 | lambda k: k=='id', 57 | lambda k: k.endswith('_id'), 58 | lambda k: k==('docid'), 59 | lambda k: True] 60 | def score(key): 61 | prio = [i for i,f in enumerate(prios) if f(key)][0] 62 | return (prio, lengths.get(key,0)) 63 | return sorted(keys, key=score) 64 | 65 | args = sys.argv[1:] 66 | PRINT_HEADER = False 67 | if '-c' in args: 68 | PRINT_HEADER = True 69 | args.pop(args.index('-c')) 70 | 71 | json_iter = safe_json_iter(sys.stdin) 72 | keys = args 73 | if not keys: 74 | top = take(1000, json_iter) 75 | keys = set() 76 | for item in top: keys |= set(item.keys()) 77 | keys = order_keys(keys, top) 78 | json_iter = itertools.chain(top, json_iter) 79 | 80 | BAD_WS = re.compile(r"[\r\n\t]") 81 | 82 | def clean_cell(x): 83 | if x is None: return "" 84 | if isinstance(x, unicode): 85 | return BAD_WS.sub(" ", x.encode('utf-8')) 86 | if isinstance(x, str): 87 | return BAD_WS.sub(" ", x) 88 | return x 89 | 90 | def stringify(x): 91 | if isinstance(x, str) and not isinstance(x, unicode): return x 92 | if isinstance(x, unicode): return x.encode('utf-8') 93 | return str(x) 94 | 95 | def lookup(myjson, k): 96 | # return myjson[k] 97 | if '.' in k: 98 | # jpath path 99 | ks = k.split('.') 100 | v = myjson 101 | for k in ks: 102 | if v is None: 103 | pass 104 | else: 105 | v = v.get(k,{}) 106 | return v or "" 107 | return myjson.get(k,"") 108 | 109 | if PRINT_HEADER: 110 | print "\t".join([k.encode('utf-8') for k in keys]) 111 | for json in json_iter: 112 | print "\t".join([stringify(clean_cell(lookup(json,k))) for k in keys]) 113 | #print "\t".join([clean_cell(json[k]) for k in keys]) 114 | #print(*[clean_cell(json[k]) for k in keys], sep="\t") 115 | 116 | -------------------------------------------------------------------------------- /json2tsv_testdata/30lines_bad_json.txt: -------------------------------------------------------------------------------- 1 | {asdfafsd 2 | asdf 3 | wer 4 | asdf 5 | sadf 6 | afsdaf 7 | sdfa 8 | sdcxzv 9 | cxvz 10 | r 11 | wer 12 | erw 13 | asfd 14 | asfd 15 | sd 16 | xzcv 17 | cxzv 18 | ads 19 | adsf 20 | sadf 21 | we 22 | rwe 23 | eraw 24 | asdf 25 | afsd 26 | zcvx 27 | zxcv 28 | cvx 29 | vcx 30 | vcx 31 | -------------------------------------------------------------------------------- /json2tsv_testdata/30lines_bad_ws.txt: -------------------------------------------------------------------------------- 1 | {"a":5, "b": "hi\tthere"} 2 | {"a":5, "b": "hi\tthere"} 3 | {"a":5, "b": "hi\tthere"} 4 | {"a":5, "b": "hi\tthere"} 5 | {"a":5, "b": "hi\tthere"} 6 | {"a":5, "b": "hi\tthere"} 7 | {"a":5, "b": "hi\tthere"} 8 | {"a":5, "b": "hi\tthere"} 9 | {"a":5, "b": "hi\tthere"} 10 | {"a":5, "b": "hi\tthere"} 11 | {"a":5, "b": "hi\tthere"} 12 | {"a":5, "b": "hi\tthere"} 13 | {"a":5, "b": "hi\tthere"} 14 | {"a":5, "b": "hi\tthere"} 15 | {"a":5, "b": "hi\tthere"} 16 | {"a":5, "b": "hi\tthere"} 17 | {"a":5, "b": "hi\tthere"} 18 | {"a":5, "b": "hi\tthere"} 19 | {"a":5, "b": "hi\tthere"} 20 | {"a":5, "b": "hi\tthere"} 21 | {"a":5, "b": "hi\tthere"} 22 | {"a":5, "b": "hi\tthere"} 23 | {"a":5, "b": "hi\tthere"} 24 | {"a":5, "b": "hi\tthere"} 25 | {"a":5, "b": "hi\tthere"} 26 | {"a":5, "b": "hi\tthere"} 27 | {"a":5, "b": "hi\tthere"} 28 | {"a":5, "b": "hi\tthere"} 29 | {"a":5, "b": "hi\tthere"} 30 | {"a":5, "b": "hi\tthere"} 31 | -------------------------------------------------------------------------------- /lamecut: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ like 'cut' but assumes a header and you specify the columns you want by 3 | name instead of position 4 | 5 | not as good as 'namecut', use that instead 6 | """ 7 | import sys 8 | 9 | names = [] 10 | for x in sys.argv: 11 | if x.startswith('-f'): 12 | name = x[2:] 13 | if not name: raise Exception("need column name") 14 | names.append(name) 15 | #print names 16 | 17 | input = sys.stdin 18 | header = input.readline()[:-1].split("\t") 19 | if any(n not in header for n in names): 20 | raise Exception("all specified names must be in the header") 21 | name_pos = [header.index(n) for n in names] 22 | 23 | print "\t".join([header[i] for i in name_pos]) 24 | for line in input: 25 | pieces = line[:-1].split("\t") 26 | out = [pieces[i] for i in name_pos] 27 | print "\t".join(out) 28 | -------------------------------------------------------------------------------- /namecut: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | $doc = %{ 4 | namecut [column names and/or 1-based indexes] 5 | 6 | Assume first line is a header. 7 | Those columns are extracted (like sql select). 8 | Like 'cut' but with names; and jankier. 9 | } 10 | 11 | if STDIN.tty? 12 | STDERR.puts $doc.strip 13 | exit 1 14 | end 15 | 16 | colnames = $stdin.readline.chomp.split("\t") 17 | cols = ARGV 18 | problems = [] 19 | col_inds = cols.map { |c| 20 | if c =~ /^\d+$/ 21 | c = c.to_i 22 | raise "bad column number (1-indexed): #{c}" if c<=0 || c > cols.size+1 23 | c -= 1 24 | else 25 | c = $1 if c =~ /^-f(.*)/ 26 | raise "don't support cut's full -f syntax yet" if c =~ /,/ 27 | colnames.index(c) or problems << c 28 | end 29 | } 30 | if problems.size > 0 31 | problems.each{|problem| $stderr.puts "No column with name: #{problem}"} 32 | exit -1 33 | end 34 | 35 | puts col_inds.map{|i| colnames[i]}.join("\t") 36 | 37 | $stdin.each do |line| 38 | parts = line.chomp.split("\t") 39 | puts col_inds.map{|i| parts[i]}.join("\t") 40 | end 41 | -------------------------------------------------------------------------------- /sas2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | # This was written to deal with sf1geo.sas in http://www.census.gov/support/2000/SF1/SF1SAS.zip 3 | # It describes a fixed-width format file. 4 | # This is probably really limited for the format. 5 | """ 6 | USAGE 7 | sas2tsv [option] schema.sas data.dat [field1 field2...] 8 | 9 | -d output just the schema as JSON. 10 | -h output just the header as TSV. 11 | 12 | Otherwise, convert input data to TSV, outputting specified fields. 13 | If no fields specified, do all of them. 14 | """ 15 | 16 | import sys,os,re 17 | import tsvutil;tsvutil.fix_stdio() 18 | 19 | def parse_sas_schema(sas_schema): 20 | input_block = re.search('\s* INPUT \s+ ( [^;]* );'.replace(' ',''), sas_schema, re.M).group(1) 21 | inputs = input_block.strip().split('\n') 22 | inputs = [L.strip() for L in inputs if L.strip()] 23 | 24 | field_info = {} 25 | all_fields = [] 26 | for input in inputs: 27 | if '$' in input: 28 | field,char_range = input.split('$') 29 | else: 30 | field = input 31 | field = field.strip() 32 | all_fields.append(field) 33 | field_info[field] = {} 34 | 35 | char_range = char_range.strip() 36 | if char_range: 37 | start,end = char_range.strip().split('-') 38 | start,end = int(start), int(end) 39 | field_info[field]['range'] = (start-1, end) 40 | 41 | label_block = re.search(r'^\s* LABEL \s+ ( [^;]* );'.replace(' ',''), sas_schema, re.M).group(1) 42 | labels = label_block.strip().split('\n') 43 | labels = [L.strip() for L in labels if L.strip()] 44 | for label_line in labels: 45 | field,label = re.search(r'([^=]+)=(.*)',label_line).groups() 46 | label = label.strip() 47 | field_info[field]['label'] = label 48 | 49 | return all_fields, field_info 50 | 51 | 52 | dump_schema = '-d' in sys.argv 53 | if dump_schema: 54 | sys.argv.pop(sys.argv.index('-d')) 55 | just_header = '-h' in sys.argv 56 | if just_header: 57 | sys.argv.pop(sys.argv.index('-h')) 58 | sas_schema = sys.argv[1] 59 | sas_schema = open(sas_schema).read() 60 | sas_schema = re.sub('/\* .*? \*/'.replace(' ',''), '', sas_schema) 61 | all_fields, field_info = parse_sas_schema(sas_schema) 62 | 63 | if dump_schema: 64 | import json 65 | print json.dumps({'all_fields':all_fields, 'field_info':field_info}, sort_keys=True, indent=4) 66 | sys.exit(0) 67 | if just_header: 68 | print '\t'.join(all_fields) 69 | sys.exit(0) 70 | 71 | data = sys.stdin if sys.argv[2]=='-' else open(sys.argv[2]) 72 | keys = sys.argv[3:] or all_fields 73 | 74 | key_ranges = [field_info[k]['range'] for k in keys] 75 | print '\t'.join(keys) 76 | for line in data: 77 | values = [line[s:e] for s,e in key_ranges] 78 | print '\t'.join(values) 79 | 80 | -------------------------------------------------------------------------------- /ssv2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | Space-separated fields => tab separated. very tolerant of inconsistent 4 | numbers of spaces. Examples: 5 | 6 | uniq -c | ssv2tsv 7 | echo id name count | ssv2tsv 8 | 9 | This really should be called 'ssv2tab' or 'space2tab' to be more in-line with 10 | the naming conventions elsewhere, but I personally find those names harder to 11 | remember. 12 | """ 13 | import sys 14 | import tsvutil 15 | tsvutil.fix_stdio() 16 | 17 | for line in sys.stdin: 18 | print "\t".join([tsvutil.cell_text_clean(x) for x in line.split()]) 19 | -------------------------------------------------------------------------------- /tabawk: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | tabawk [same args as awk] 4 | 5 | Wrapper around 'awk' for tab-separation for both input and output records 6 | """ 7 | 8 | import sys, subprocess, os 9 | 10 | if len(sys.argv)==1: 11 | print>>sys.stderr, __doc__.strip() 12 | sys.exit(1) 13 | 14 | awk_args = sys.argv[1:] 15 | awk_cmd = (os.environ.get("AWK") or "awk").strip() 16 | cmd = [awk_cmd, "-F\t", "-v", r"OFS=\t"] + awk_args 17 | # print>>sys.stderr, cmd 18 | ret = subprocess.call(cmd) 19 | sys.exit(ret) 20 | 21 | -------------------------------------------------------------------------------- /tabsort: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Wrapper for 'sort' with tab-delimiting. 3 | export TAB=$(echo -e "\t") 4 | exec sort "-t$TAB" "$@" 5 | -------------------------------------------------------------------------------- /tar2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | r""" 3 | Output one-file-per-line from a tar file, in the format 4 | 5 | Filename \t FileContentsAsJSONString 6 | 7 | JSON-encoded strings are used since they never contain tabs nor newlines 8 | (they're escaped), and they sometimes are fairly greppable. 9 | 10 | Why? Because scanning one big file is often much faster than scanning through 11 | lots of little files as you would unpack a tarball -- e.g. "grep" vs "grep -r". 12 | Too often, people distribute data as a tarball of lots of little files. If you 13 | unpack it, this is good for random access, but bad for large-scale scans. The 14 | latter is more common in large-scale data analysis. 15 | 16 | (Alternative approach: The tarfile format allows for sequential access. 17 | In python, see the 'tarfile' standard library.) 18 | 19 | Example: 20 | 21 | /d/nyt_ldc/data/2006 % for f in *.tgz; {tar xf $f; tar2tsv $f > ${f:t}.tsv} 22 | 23 | (1) Searching the unpacked directories: 24 | ... the speed-up is after lots of disk scanning. With large datasets, you 25 | don't get that speedup because they can't be cached. 26 | /d/nyt_ldc/data/2006 % time grep -r hope */ > /dev/null 27 | grep -r hope */ > /dev/null 1.73s user 1.84s system 47% cpu 7.468 total 28 | /d/nyt_ldc/data/2006 % time grep -r hope */ > /dev/null 29 | grep -r hope */ > /dev/null 1.67s user 1.15s system 99% cpu 2.817 total 30 | /d/nyt_ldc/data/2006 % time grep -r hope */ > /dev/null 31 | grep -r hope */ > /dev/null 1.67s user 1.12s system 99% cpu 2.796 total 32 | 33 | 34 | (2) Searching the TSV-JSON files: 35 | /d/nyt_ldc/data/2006 % time grep hope *.tsv > /dev/null 36 | grep hope *.tsv > /dev/null 1.02s user 0.30s system 99% cpu 1.320 total 37 | /d/nyt_ldc/data/2006 % time grep hope *.tsv > /dev/null 38 | grep hope *.tsv > /dev/null 1.02s user 0.30s system 99% cpu 1.321 total 39 | 40 | """ 41 | 42 | import sys,tarfile 43 | #import json 44 | import ujson as json 45 | filenames = sys.argv[1:] 46 | for tar_filename in filenames: 47 | tf = tarfile.open(tar_filename) 48 | for tarinfo in tf: 49 | if tarinfo.isfile(): 50 | fp = tf.extractfile(tarinfo) 51 | contents = fp.read() 52 | print "%s\t%s" % (tarinfo.name, json.dumps(contents)) 53 | 54 | -------------------------------------------------------------------------------- /test/test.py: -------------------------------------------------------------------------------- 1 | tests = [ 2 | dict(command="tsvcat a1 a2", output="out.simple", dir="tsvcat1"), 3 | dict(command="tsvcat rel=gold_rel a1 a2", output="out.rename", dir="tsvcat1"), 4 | ] 5 | 6 | 7 | -------------------------------------------------------------------------------- /test/tsvcat1/a1: -------------------------------------------------------------------------------- 1 | query url rel notes 2 | free email http://geocities.yahoo.com/ 0 3 | free email http://email.about.com/od/freeemailreviews/tp/free_email.htm 3 4 | free email http://mail.yahoo.com/ 3 5 | all good festival http://www.goodmusicforall.com/ 0 6 | all good festival http://crookedtimber.org/2009/03/04/all-good-things/ 0 7 | all good festival http://www.coachella.com/ 0 8 | all good festival http://www.allgoodfestival.com/ 3 9 | me.com http://howmanyofme.com/ 0 10 | me.com http://www.me.com/ 3 11 | -------------------------------------------------------------------------------- /test/tsvcat1/a2: -------------------------------------------------------------------------------- 1 | query url rel 2 | 18p2p forum http://forum.fdzone.org/ 0 3 | 18p2p forum http://forum.fdzone.org/viewthread.php?tid=1872264 0 4 | 18p2p forum http://forum.tw.fdzone.org/ 0 5 | 18p2p forum http://forum.tw.fdzone.org/viewthread.php 0 6 | 18p2p forum http://forum.tw2.fdzone.org/ 0 7 | 18p2p forum http://oversea.forum.fdzone.org/ 0 8 | 18p2p forum http://www.btmon.com/file/18P2P-Forum.url 0 9 | 18p2p forum http://www.forumsdot.com/visit-205-18p2p-dot-forumsdot-dot-com.html 0 10 | 18p2p forum http://www.p2pforum.it/forum/archive/index.php/f-25-p-18.html 0 11 | -------------------------------------------------------------------------------- /test/tsvcat1/out.rename: -------------------------------------------------------------------------------- 1 | query url gold_rel notes 2 | free email http://geocities.yahoo.com/ 0 3 | free email http://email.about.com/od/freeemailreviews/tp/free_email.htm 3 4 | free email http://mail.yahoo.com/ 3 5 | all good festival http://www.goodmusicforall.com/ 0 6 | all good festival http://crookedtimber.org/2009/03/04/all-good-things/ 0 7 | all good festival http://www.coachella.com/ 0 8 | all good festival http://www.allgoodfestival.com/ 3 9 | me.com http://howmanyofme.com/ 0 10 | me.com http://www.me.com/ 3 11 | 18p2p forum http://forum.fdzone.org/ 0 12 | 18p2p forum http://forum.fdzone.org/viewthread.php?tid=1872264 0 13 | 18p2p forum http://forum.tw.fdzone.org/ 0 14 | 18p2p forum http://forum.tw.fdzone.org/viewthread.php 0 15 | 18p2p forum http://forum.tw2.fdzone.org/ 0 16 | 18p2p forum http://oversea.forum.fdzone.org/ 0 17 | 18p2p forum http://www.btmon.com/file/18P2P-Forum.url 0 18 | 18p2p forum http://www.forumsdot.com/visit-205-18p2p-dot-forumsdot-dot-com.html 0 19 | 18p2p forum http://www.p2pforum.it/forum/archive/index.php/f-25-p-18.html 0 20 | -------------------------------------------------------------------------------- /test/tsvcat1/out.simple: -------------------------------------------------------------------------------- 1 | query url rel notes 2 | free email http://geocities.yahoo.com/ 0 3 | free email http://email.about.com/od/freeemailreviews/tp/free_email.htm 3 4 | free email http://mail.yahoo.com/ 3 5 | all good festival http://www.goodmusicforall.com/ 0 6 | all good festival http://crookedtimber.org/2009/03/04/all-good-things/ 0 7 | all good festival http://www.coachella.com/ 0 8 | all good festival http://www.allgoodfestival.com/ 3 9 | me.com http://howmanyofme.com/ 0 10 | me.com http://www.me.com/ 3 11 | 18p2p forum http://forum.fdzone.org/ 0 12 | 18p2p forum http://forum.fdzone.org/viewthread.php?tid=1872264 0 13 | 18p2p forum http://forum.tw.fdzone.org/ 0 14 | 18p2p forum http://forum.tw.fdzone.org/viewthread.php 0 15 | 18p2p forum http://forum.tw2.fdzone.org/ 0 16 | 18p2p forum http://oversea.forum.fdzone.org/ 0 17 | 18p2p forum http://www.btmon.com/file/18P2P-Forum.url 0 18 | 18p2p forum http://www.forumsdot.com/visit-205-18p2p-dot-forumsdot-dot-com.html 0 19 | 18p2p forum http://www.p2pforum.it/forum/archive/index.php/f-25-p-18.html 0 20 | -------------------------------------------------------------------------------- /tsv2csv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | import csv,sys 3 | 4 | def tsv_reader(f): 5 | #return csv.DictReader(f, dialect=None,delimiter="\t",quoting=csv.QUOTE_NONE) 6 | return csv.reader(f, dialect=None,delimiter="\t",quoting=csv.QUOTE_NONE) 7 | 8 | w = csv.writer(sys.stdout) # encoding issue 9 | for row in tsv_reader(sys.stdin): 10 | w.writerow(row) 11 | 12 | 13 | -------------------------------------------------------------------------------- /tsv2fmt: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | Outputs an ascii-art table with aligned columns. 4 | Reminiscent of Postgres and MySQL commandlines. 5 | """ 6 | #from __future__ import print_function 7 | import sys 8 | from collections import defaultdict 9 | #import tsvutil 10 | #tsvutil.fix_stdio() 11 | 12 | OUTER_BORDERS = True 13 | INNER_BORDERS = True 14 | if '-o' in sys.argv: 15 | OUTER_BORDERS = False 16 | if '-b' in sys.argv: 17 | OUTER_BORDERS = False 18 | INNER_BORDERS = False 19 | 20 | 21 | #width_hists = [defaultdict(lambda:0) for j in range(J)] 22 | width_hists = defaultdict(lambda: defaultdict(lambda:0)) 23 | 24 | rows = [] 25 | for line in sys.stdin: 26 | vals = line[:-1].split("\t") 27 | vals = [v.strip() for v in vals] 28 | 29 | #for j in range(J): 30 | for j in xrange(len(vals)): 31 | val_len = len(vals[j].decode('utf-8','replace')) 32 | width_hists[j][val_len] += 1 33 | rows.append(vals) 34 | 35 | if not rows: sys.exit() 36 | 37 | J = max(width_hists.keys()) + 1 38 | assert range(J) == sorted(list(width_hists.keys())) 39 | 40 | widths = [max(width_hists[j].keys()) for j in range(J)] 41 | 42 | # todo, if >5ish rows, drop high-width outliers in a column when computing the 43 | # global width to use. so rows with outliers look bad but rest are good. 44 | # outlier rule something like, e.g. .. >=95percentile if min outlier > 20char bigger than 94th percentile 45 | 46 | def print_row(row): 47 | global widths 48 | if OUTER_BORDERS: sys.stdout.write("| ") 49 | if len(row) < J: row += [""] * (J - len(row)) 50 | joiner = " | " if INNER_BORDERS else " " 51 | sys.stdout.write(joiner.join([("%-"+str(widths[j])+"s") % row[j] for j in range(J)])) 52 | if OUTER_BORDERS: sys.stdout.write(" |") 53 | sys.stdout.write("\n") 54 | 55 | def print_sep(): 56 | global widths 57 | for j in range(J): 58 | sys.stdout.write("+"+("-"*(2+widths[j]))) 59 | print "+" 60 | 61 | #print_sep() 62 | #print_row(rows[0]) 63 | #print_sep() 64 | 65 | #print("-"* (1+sum([w+3 for w in widths]))) 66 | for row in rows: 67 | print_row(row) 68 | 69 | #print_sep() 70 | -------------------------------------------------------------------------------- /tsv2html: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """make an html table useful for ad-hoc reporting, e.g. in a wiki or webpage""" 3 | 4 | import sys 5 | 6 | header = """ 7 | 8 | 9 | 10 | 11 | 18 | """ 19 | 20 | def print_rows(): 21 | for line in sys.stdin: 22 | parts = line[:-1].split("\t") 23 | sys.stdout.write("") 24 | for part in parts: sys.stdout.write("672116731267403675467656776 -------------------------------------------------------------------------------- /xlsx_test/ss.xml: -------------------------------------------------------------------------------- 1 | 2 | Saw the wierdst Britsh play with mad fake actor cigaretts in the air., like lightn a vitamin on fire. yuck. At the Hammr now. Dinner next [EMOTICON]@JazzeeJEF Yummy!! Save me sum [EMOTICON]@paperbacklove it was me [EMOTICON]is worn out, but had a good day. [EMOTICON]@immunity too late now, class is over! [EMOTICON] I'll get them this weekend or something! #lanyardsNothing like the Spice Girls for motivation [EMOTICON]&quot;The Herd of Independent Minds&quot; [EMOTICON] Love that quote [EMOTICON]@Gazmaz Have you ever thought of just binning Windows and being done with it? It sounds like a painful night [EMOTICON]@SlapShotSal Yeah but just wait on how expensive cars are going to be in 6 years [EMOTICON]send out sed and awk to edit system files on hundreds of systems. watching it runs and hopefully nothing breaks [EMOTICON]@veilleperso 100% des gagnants ont tenté leur chance [EMOTICON] merci ça fait du bien d'être ainsi rassuré [EMOTICON]@iskandr okido [EMOTICON]@CherylSmith999 heyy it's Sept 15th! @fyttvilletweets has all the lovely details! thx for asking! [EMOTICON]O Isaias Malta fez uma excelente análise do Uêba [EMOTICON] http://is.gd/1Z5k@dougsymington Not.Helping.@dragon_harrower let him type something for us oneday@toolbear no actually not important, only a password to my nexon accountOMITOMITOMITOMITxxx@itgyrl LOL it's d worse [EMOTICON]back from lunch at Universal City Walk to say goodbye to a co-worker and needing a nap. Need to find a new job. [EMOTICON]Didn't get to milk a cow [EMOTICON]@camilaoliveira Follow now! [EMOTICON] Great...@zombie_plan they haven't updated the site! I've emailed but they're crap at communications [EMOTICON] almost as bad as myself............... ..@william_bokunic Where are you on msn?? [EMOTICON] [EMOTICON]Confirmado: Hoje, matéria comigo no SBT Brasil, por volta das 23h, no SBT. [EMOTICON] O programa é sobre internet.uy... O.o atacazo artístico jajaja asi me coge.. (poema) [EMOTICON]Imac ist da wurd einer mit 8800gs trotz nur hd 2600 pro bestellt und bezahlt. Schön [EMOTICON]@Xianthe I will [EMOTICON] Should be a good timesailing from Winterfell Ebonshire to Port Caledon [EMOTICON]I like weekends. We should have more of them. [EMOTICON]home is boring. I'm just going to sit on the computer and watch cartoons because its the only fun thing here. [EMOTICON]@MikeRapin Way to go then. That'll be really good. I would but I can't. I've tried it. Impossible for me. [EMOTICON]BRING IT ON FAY!! I'M READY FOR YA!! [EMOTICON]quiet night at home with Pete, wine, takeout, TV...and my fleece blanket [EMOTICON]going to Chili's for 2 for 1's...then maybe to the Vue...nightlife in Clermont. [EMOTICON]@LuisExMachina jajajaja shalalaa... pueees si los veo pero... no ubike [EMOTICON]Y Tropic Thunder me ha encantado, no he podido parar de reirme en toda la película... [EMOTICON]Finalement c'est pas ci ensoleillé ... [EMOTICON] http://snipurl.com/3jd0pIm on my way home [EMOTICON]Cramps officially gone!!! Can you say Oreo Brownies!!!!!!!! [EMOTICON]OMITOMITJust checked out #TweetDeck which has integrated keyword search from #summize. and now i tweet about it from twhirl [EMOTICON]Eating strawberries that were picked this morning and making jelly. My tummy hurts. [EMOTICON]@LIT_XD Your welcome! [EMOTICON]Where have all the updates gone? [EMOTICON]Cool, soothing music... loud... paint... this is all helping! [EMOTICON]Kitchen done! Step 2: R&amp;R [EMOTICON] @ The pad http://tinyurl.com/3ff7reEarly baby today. [EMOTICON]wondering if there is somewhere we can rent a place for like oh i dunno 400 bucks a month that is NOT ghetto. [EMOTICON] we need our own place!Grr, oprah, not opera. [EMOTICON]Mais si c'est pas possible alors ... à dans une semaine tout le monde [EMOTICON]Bad: In the office on a Saturday [EMOTICON] Good: Getting ahead on my email.@pedroniusprime - are we going to have access to these recordings by any chance? Sounds like a great holiday... [EMOTICON] Loving mine - Gold Coast@kallardnyc i sent a twitpic. it's $8 bones, not terrible. i cant really review cause of cold. have 2 more bottles. i must have liked it [EMOTICON]@billbates is this better Bill? I'm the one testing you. [EMOTICON]Maybe his daddy can take tips from him? [EMOTICON]@iPhil Nem imaginam o que perdem [EMOTICON]@onefoodguy: The best way to deal with that is to contact support@seriouseats.com. We try to check Twitter here, but we often miss things [EMOTICON]My new favorite freelancing tool is FreshBooks: https://melissa.freshbooks.com/signup/ ... use my referral if you sign up! It ROCKS! [EMOTICON]Just sent my poor baby away [EMOTICON]Can't get a hold of my hairdresser....need haircut &amp; highlights...don't know who else to call [EMOTICON]Juaz tengo disque un asesor y 3 pupilos, me presiona el asesor y me presionan los pupilos. [EMOTICON]just came back from fishing...i caught my 2nd bass! sweeeet [EMOTICON]Hello world [EMOTICON]LOL -- all I know about Speaking French I owe to Twitter. [EMOTICON] Thanks @speters and @dschinkeerste nachtrit: brommerpech.1 brommer en veel bagage staat nog bij ene conny in een kroeg in maarssen.wij zijn in utrecht.avontuur [EMOTICON]@ejacqui: I knew. [EMOTICON] It's not as cool as the open API that Dominos provides for third-party pizza ordering applications though.@shrdlu no exorcism! first get video of it and show it off to friends and boyfriends when she's in high school [EMOTICON]@adnrw haha.. that's a broad question [EMOTICON]Just found out (old news) they're making a new Fast and Furious, but this will be a true sequel to the first. Letty and Dom return, w00t. [EMOTICON]is smiling. Get over it. [EMOTICON]I just voted. Web site are ready with my favorite. http://is.gd/44WP. Let's get results until the site crash [EMOTICON]@mucullus omg ... das hab ich davon [EMOTICON]to carente [EMOTICON]I start Tuesday! Monday is Labor Day. [EMOTICON]@abdur can haz big brother? [EMOTICON] Stop watching meh!The best pint ive had in ages.... maybe the only pint ive had in ages ??? got to get up for work tomorrow [EMOTICON] again@SystemMatt I got Bx4 B C D D B C [EMOTICON] Good luck! Hope you got what you're after! And good luck to everyone else, chillax about it [EMOTICON]@seanpdesign : Veeeesta baby, Veeeeesta! i'm back to no mac and i may not go back. HA! (ok, i do miss my iPhone &amp; i'm taking donations) [EMOTICON]@stuarta: Thanks! I'll be glad to add any tech events to CodeCampJunkie as long as they are community-based. Just forward me a link. [EMOTICON]@MattStaggs Tell her I love that magazine [EMOTICON]@graywolf - &quot;On Linux, Ubiquity isn't fully supported yet&quot; [EMOTICON] crap@photocopyme And redundant [EMOTICON]@Rinze Comprendo PERFECTAMENTE ese chiste... [EMOTICON]@doorofkukondo @stephenfry &gt; almost everybody. He was rector of my uni (before handing it over to Tony Slattery) and was awesome [EMOTICON]@LadyInWaiting I so hate the idea of playing games but I'm you're right that that's how it plays out. Oh well, better enjoy it. [EMOTICON]http://twitpic.com/g4uh - My boys and I at a farm this afternoon picking pumpkins [EMOTICON]@joanofdark Cool. [EMOTICON] This will be good. For the kids.@natepilling: Sorry to hear, but good to hear. [EMOTICON]@TokenUser my existence is impossible to prove, yet here I am. [EMOTICON]que te paso chikita [EMOTICON]Tried on part of my totally non-scary Halloween costume and my kitty hid under the bed [EMOTICON]finally a day offffff! [EMOTICON] super tired and about to go work on my new hairbows....photoshoot tomorrow so you can all see how fab they will be@thinkerdog awesome marble game thingy [EMOTICON]@mtorchiari que poco cariño nos tenes a nosotros los nerds.. [EMOTICON]Fogo traduzir isto é mais difícil do que eu pensava, tem tanta coisa para mudar, pelo menos umas 2 horas de trabalho. [EMOTICON]Ahhhh esta lloviendo en Mexicali... Eso solo significa que habrá problemas [EMOTICON]Birthday coming up http://tinyurl.com/nb5uh hint, hint [EMOTICON] Or a facebook wall post will do nicelyIs this tweeting getting annoying on the blog end of the world? My small blog audience seems to have all but vanished. [EMOTICON]@isnoggedharry It has been far too long [EMOTICON] Alas, I've now got to finish Spanish and get some sleep. I hope your toe heals asap.bem, para a cama. já só vou ter 6 horinhas de descanso. [EMOTICON]@ PF Changs for dinners! Out of work before sunset [EMOTICON] in Alpharetta, GAI'm a cool cat. [EMOTICON]@al86shaw you need to follow more people then, find more interesting ones. Mine goes all day [EMOTICON]done with GOTV work for the day, and time to don my finest red and head to south philly. [EMOTICON]@tomkaters no con for you? [EMOTICON]@JDakar I write Erotica stories &amp;4 some reason ppl ask me ?'s like Im an advice columnist or expert. I find it funny yet I entertain em [EMOTICON]@duckdeux hooray!!! terry thanks you! [EMOTICON]@angesbiz hope your friend survived. [EMOTICON] Have a fantastic day!@davebrook nope- guys are just to sensitive [EMOTICON]no one wants to hang out with me [EMOTICON]@timdowell Was that for the front 9? or the back? [EMOTICON]Sarah, the younger Papillon has an unhealthy interest in the baby chicks. Unhealthy for the chicks. [EMOTICON]@Kreeoni lol no i caught it man lol didnt even realise [EMOTICON] cheers again for the info [EMOTICON]I'm actually excited for the bike ride home. Weeeee [EMOTICON]diggnation in stl...no live show [EMOTICON]MAN i love wine! pinot noir is my wine of choice right now [EMOTICON]@kenziep and it was free. [EMOTICON]gol do atletico mineiro [EMOTICON]Now playing: On Air: Mike Emvee - Aria of Musik 002 on AH.FM [EMOTICON] http://tinyurl.com/3suuw6Looking forward to Gretchen's arrival. Still undecided about work, BAH. [EMOTICON]back from a lovely and peaceful day at the river...hmmmm [EMOTICON]I'm so tired and depressed [EMOTICON]@dollyhouse donde esta lo de los coloresssssssss.... that i like [EMOTICON]it's like having a brand new computer! but i miss all my old settings. [EMOTICON] UGH!!!!!!@michele600 you'll figure it out. no time at all [EMOTICON] how are you?Finally got in the lbp beta! Gameslurp had 3 left and won competion for one of the 3 keys, happy days!! [EMOTICON]I want to read something I can't remember writing .. so far I'm too keen to seem forgetful as I dig back in my ancient blog posts [EMOTICON]@Sarcomical [EMOTICON]Meu msn está online em casa (MSN9) e não consigo logar do trabalho. Caso alguém mande msg eu só responderei qdo chegar em casa [EMOTICON]Went to Michaels to pick up Halloween dec supplies. My son threw up in front of the Martha Stewart window decals. [EMOTICON]@frozenpandaman yup, haven't done that in a long time [EMOTICON]@KatArmstrong [EMOTICON] I hope everything will be ok Kat good luck@FrankAddante drive from there everyday to work!!! [EMOTICON]Alguien me manda sus correos para agregarlos a gtalk [EMOTICON]@mangandini y tampico sucks [EMOTICON]Time to make dinner. Organic free range chicken Moroccan style with preserved lemons, kalamata olives &amp; cilantro. I love this dish [EMOTICON]yet it's only been 10 minutes [EMOTICON] Time is relative. Time is Man's way of saying HURRY UP. Stop the clock watching, Stop the madness and knowFinally home. [EMOTICON] Homework. NOT.@seisenstadt I remember you saying it was going to be late. I'm just heading up for a nap &amp; a shower. I'll see you there around 11:00. [EMOTICON]peeing myself while hiding from the thunderstorms [EMOTICON]@youngmomma I love my girl...she has her moments of both fun and frustration, but so does my son. They are quite diffenent moments! [EMOTICON]@mandybarth Grana [EMOTICON]Fun Fur is awesome yarn, but difficult to work with [EMOTICON]Go to nathanarnold.wordpress.com, new blog with link to video of President Bush announcing the Battle of the Bands winners. [EMOTICON]I just finished Breaking Dawn! o.O Bella let Edward read her mind [EMOTICON] I love this book lolback from seeing 'Cabaret' at Teatro Maria Matos. quite enjoyable [EMOTICON]@paniclover I sent you bday wishes on myspace, but happy bday [EMOTICON]@raynuez I agree I don't like this you not sitting next to me we don't talk about tv stuff [EMOTICON]@tbone37 yuck now i have to do laundry! [EMOTICON]@Bella_Casa Yeah, but at least he gets pissed off equally. [EMOTICON]Unlocked for 2.0 but nowww can't get my Internet going boo. [EMOTICON]@CatBulsara y eso? cómo? ves que eres seca? haces unas magias que yo no puedo [EMOTICON]so sad to hear about the cuts from Rev 3, I know how they must feel! [EMOTICON]I am going to save my $ for that new iPod Nano. Love the design! [EMOTICON]@Airmo I'll be there [EMOTICON]Trying to get homework done now that PCPGH3 is over [EMOTICON]filme bacana agora no TeleCine Premium [EMOTICON] semana que vem chega a minha nova TV o/ ha!@zigdon It's called yes| [EMOTICON]I want to try a dk already [EMOTICON]So, Target may not have pink chicken scissors, but Amazon.com has a pink garden hose! [EMOTICON] http://tinyurl.com/4xq4qp@papajohn I can't read any of that blog post.. I am disappointed becoz I have been waitng for an update from you [EMOTICON]Currently backing up 1Password/keychain, marking applications in AppFresh for reinstall, and worrying that I will forget something. Crap [EMOTICON]En chinga desde las 3 :S y hasta las 8 [EMOTICON]http://www.justin.tv/lealovesyou101 just another girl with boobs. the good harmony is back [EMOTICON] http://www.justin.tv/harmonized oorahh.Just booked flights on Monday to Dusseldorf and then heading to Enschede. Meeting Steve Mclaren and Theo Snelders [EMOTICON]ok ok ok mr horsey, back to jewelry I go [EMOTICON]I am dozing off at my desk [EMOTICON]This is such a good weekend [EMOTICON]Picking up Sporty from soccer practice &amp; heading to Ignite worship. Still miffed her team has practice on Wednesdays. [EMOTICON]Spell check bri'anna? [EMOTICON]es increible la clase de programacion orientada a objetos 2!! y pinta chevere la clase de sistemas digitales y microprocesadores [EMOTICON]my phone is fucked ..... since I drop it, [EMOTICON] [EMOTICON]marks got a migraine [EMOTICON] anybody want to jam some hand drums tonight?@LifeCoachMary -L'Occitane shea butter one of my desert island products! And sad but true - I love office supply stores! [EMOTICON]@jeremywright heh i can translate.. let's do drinks tonight [EMOTICON]@montjito parece que están muriendo sus servidores [EMOTICON]@brampitoyo When I go to your site, part starts expanded... then contracts. the experience is very jarring. Using FF on Mac. Just FYI [EMOTICON]Ah! I cheated and now I'm Jasmine [EMOTICON] It's even in my profile [EMOTICON]@theiBlog Lets goto bed punching our livers! [EMOTICON]Vuelto de la twittche, muuuuuuuuuuuuuuy buena! una lástima que no me pudiese quedar a tomar algo [EMOTICON] buenas noches.I Is so tired. i just yawned really big and i was so tired i forgot to close my mouth. This time it was in public! [EMOTICON]@DPoulson way cool! I rated you already [EMOTICON]@sschablow That wouldn't have anything to do with the decrease job stress now would it? [EMOTICON]@KarenJL @havi I'd start shaking and probably growling if I went that long. My name's James and I'm a sugar-holic. [EMOTICON]@djjax As long as I don't have to catch a fly with chopsticks, I think I'll be ok. [EMOTICON]backyard blogging. and researching organic dairy. and fielding &quot;more ving&quot [EMOTICON] swing) requests from bean. [EMOTICON]@FuTuR3 la habitacion de fermat está curiosilla [EMOTICON]@baggiobanglio Jajaja, qué parviño [EMOTICON]@Pidders @Pidders My headphones are the worst [EMOTICON]@joeldermole No, because of the &quot;Mrs. Jones&quot; comment. [EMOTICON]@FacePaint101 If you have access to Acess [EMOTICON] I can email it to you so you can see how it's coming alongI'm done! Done with this annoying paper...reviewing it one more time and anxiously awaiting to hit send! [EMOTICON]agora vou implementar o JáCotei lá no techlive.org.... vamos ver se eu ganho uma grana [EMOTICON]parece que o cabo do mp3 morreu. alguém tem um mini-usb aí? [EMOTICON]Everyone's helping customers except me [EMOTICON]arg my IT guy is making some reports to help my marketing and branding work and he loves using HORRID colors in graphs.. cant wait [EMOTICON]I love: Varsity wraps, chips with ranch, fresh apples, my cozy bed. I hate: when Scott Riddle throws interceptions and Elon loses [EMOTICON]Just had a BLAST at www.despair.com. Wish they had an affiliate program!!! [EMOTICON]@taxgirl I was a girl scout [EMOTICON] Loved it!&quot;brillante&quot [EMOTICON] ea la de recuperar horas...por fin termino el día [EMOTICON]Away on holidays for a week. Signing off now. See yas all next Sunday! [EMOTICON]geleia de frango com catapora....pensando em um layout [EMOTICON]tropic thunder, tonight 8:10pm in mira mesa. Stuff going on before and after, interested? wrangle me [EMOTICON]???????? ???? ???????????? &quot;??????&quot;, ???? ????? ?????? ????? [EMOTICON]Fancy apartments cost fancy money [EMOTICON] Top floor of the building too..@stevedrees Bummer, NyQuil to the Rescue! [EMOTICON] Get your rest.@arhh_ I do not doubt it is colder in here. Have attempted to turn on heat. Not successful. [EMOTICON]@PDXvlog howdy sugar! [EMOTICON]@sharonceldred Oz's Sammie. 11 or so weeks pregnant [EMOTICON]@Arnell you are dreadfully behind my dear. But I still love you. [EMOTICON]Chris Crocker makes me laugh. Trust me that's saying something. Since I never laugh! Ask Mr. B it's true. [EMOTICON]Good class this afternoon, revising lesson plan for tomorrow based on feedback about rough draft from fac. member. Eating brownies later [EMOTICON]I just checked in @asae08 now what? [EMOTICON]@ibmnick And meet @spufidoo from &quot;LB&quot; as you call them. [EMOTICON]@webuildpages going to Gio's parent's house tonight ... will bring the dog with us too... our dog gets so excited to see them [EMOTICON]Bored at home. [EMOTICON] I think me and my girlfriend, Blockbuster, are going to have a nice weekend together again =/No laptop for 2 weeks. [EMOTICON]@fiendishlyfoxxy actually, i think the world is really messed up and i should just rule it. [EMOTICON]mobile/facebook livenotes interoperability is functional! Click on the 'other networks' tab [EMOTICON]@stephweiss Thanks! I do plan on taking care. [EMOTICON]@mirrorgirl bummer.. [EMOTICON] well, I definitely won't rush out there to see it today then!@okelay it's called DragonCon [EMOTICON]Good morning Sunshine! [EMOTICON]i'm such an awkward kid [EMOTICON]@TheBathProject a cool scrapbook store but it closed [EMOTICON]fed-ex package? i guess i better go see what it is ... nervous it's &quot;return to sender&quot; [EMOTICON]ick Twirl is not having a happy moment with Twitter right now [EMOTICON]@brennohayden yah, na verdade to procurando com quem dividir hotel, mas da quase no mesmo né? [EMOTICON]@beepoki the next i'm happy to be single tune: Leona Lewis *Best You Never Had* [EMOTICON]Va siendo hora de irse a dormir... Nadal ha perdido [EMOTICON]life is confusing. and i want school [EMOTICON] shower@confusedtwenty Yeah, there's no way I'll be able to give up my addiction to twitter [EMOTICON] I know too many AWESOME people on here![EMOTICON] Currently listening to Jackie Presti - Love Theme@kerihenare — Bah, he's probably too busy for minor questions like this one. [EMOTICON]At effing school again bored as hell [EMOTICON]SAD... [EMOTICON] Twisted my ankle really bad at the gym... Trying to figure out how I will workout now.@rachel315 lol well if I see you on the news, you be missed... Lol jk you'll be fine [EMOTICON]@caseykeating we lead such exciting lives... haha [EMOTICON]@JamFactory You know if it will be repeated? Watching prison break [EMOTICON]Just Posted the 10 Commandments that'll send you broke. Now it's back to the Mutual Fund Report [EMOTICON]@Neo_drone Nice! [EMOTICON]good, productive day [EMOTICON]/me viendo feo a @rockastudios por no conseguirle boletos para el manifest. [EMOTICON]just walked into a hella stinky classroom [EMOTICON] i wanna leave early cuz of the stankness! ugh gross.Just watching 1 of k9luver66's vids (the only one with good music). I miss Zak [EMOTICON]BatDan On Location: Medford WITHOUT his red jacket [EMOTICON]@alanataylor [EMOTICON]@kakavisconti Eu queria! [EMOTICON] cachecol é coisa linda!@wdrussell dude. NOT RIGHT NOW. [EMOTICON]@rebeccawatson the rain is in New York. [EMOTICON]@lexiphanic Not cool! Haha I've spent so many freakin hours in the place! I'm gonna have to find a new pub! [EMOTICON]I am sucked in to this documentary on John McCain airing on CNN: &quot;McCain Revealed&quot; - must stop now to approve a correspondent's script [EMOTICON]SIEMPRE lo supe [EMOTICON]@shannonstacey [EMOTICON] what's up punkin? email me.Once again, I'm the only student assistant at work today. This makes for a very lonely work day. [EMOTICON]is leaving the office early! ...so he can get more work done at home [EMOTICON]rEFIt only works on intel macs [EMOTICON]@victoralvarez a frenar con los pies [EMOTICON]me thinks I may have the flu!!! this sucks [EMOTICON]is alone with no-one to talk to [EMOTICON]Vaya! Llevo un 10 en 30 examencitos... Lo demás alrededor del 7 [EMOTICON]Hi everyone [EMOTICON] I'm in my new apartment. . . reading Cell Bio. Its lots of fun, actually its very dry and boring and my head hurts,@Danielsthlm bleh! [EMOTICON] but, it's back....so I'm good now. [EMOTICON] (what happened to yours?)vancouver vs. montreal tomorrow in final. same montreal team we won against on thursday [EMOTICON]@HeyItsMikey1 if it works I'll only charge u 100! [EMOTICON] my blockbuster card was able to do it fine. Great card or maybe just a crappy door!@MaternallyPosh I felt compeled to folo...Jessica told me 2 do it [EMOTICON]thanks to everyone who helped with my hair woes. Decided on Bishop's but went down &amp; they were closed! no cut, no pink streaks today [EMOTICON]@jlhcorley [EMOTICON]@ArtSpot yeah me too. So just chair dance a little like me. [EMOTICON]@roadhous1 but no one can tell if you hold your card in a certain way [EMOTICON]Finally Steve Jobs addresses the never-ending application crashing issue! Fix won't come until September [EMOTICON]@mob_igormaia e a grana odeia ficar comigo tbm... [EMOTICON]IMHO: Why Twitter is not perfect - as yet, no one attending the east coast Bob Weir shows is posting set lists in real time. [EMOTICON]@nicolespag Now who would that be? [EMOTICON]XD sorry Elliot [EMOTICON] http://flickr.com/photos/markomihelcic/2615802725/alguien sabe donde puedo encontrar un traje de pachuco [EMOTICON]@rafiq as if my seesmics weren't enough, which they weren't of course [EMOTICON]w00t? That's so old [EMOTICON]ya vale, me voy a la cama, usease a caminar hasta St Genis [EMOTICON]Wow, many dozens of new twitter followers, welcome people [EMOTICON]Strongly thinking about whether I want to be involved in another launch ever again. Too much dishonesty &amp; unethical behavior. We'll see. [EMOTICON]@bestpets having to adjust from house to apt. living! 2 dogs. 1 is a terrier and the other an aussie shep mix!!! [EMOTICON]@christinalemmy thank you! [EMOTICON]Podcaster program on iPhone just hangs for 10 seconds then shuts down [EMOTICON]en reunion de mi proyecto!! [EMOTICON]Google Chrome = [EMOTICON] eus Safari? [EMOTICON]@patrickbeeson you because Javascript without a framework is a cakewak [EMOTICON]Hmm. Blowtorch or Bubble gum? [EMOTICON]is about to cook some eggs and english muffins as she can't seem to eat breakfast before she cycles anymore [EMOTICON]@MarilynM yeah, it's all wrong. [EMOTICON]negotiating for a new car ...... [EMOTICON]@brianaker Try these: http://www.wordle.net http://www.123games.dk/game/other/goldminer/goldminer.htm [EMOTICON]@marktrolley I called dibs on sniffing the firewire port [EMOTICON]@ littlewave hello [EMOTICON]@sunnyd13 Haha, whatever. I practically lived on my iPhone while I was here. [EMOTICON]100 euri di giappo, praticamente una rata del Sigillo'... [EMOTICON]@jj_white You're welcome! [EMOTICON] Look forward to tweeting! [EMOTICON]I need to post my Daring Bakers lavash crackers. [EMOTICON]No puedo dormir mi cabeza se ha ido camino abajo [EMOTICON]hitting majorly slow performance in ConceptShare and crashing/inconsistencies of the Adobe Air app [EMOTICON]@juanrossi naaaa tremendo! [EMOTICON]@ugho que romantico! (me senti la gordita de carrusel!).. puedes besar el monitor [EMOTICON] sniffStealing Staples wifi and not wanting to go home [EMOTICON]@Rherdez es que en el de pensiones me tratan como una diva [EMOTICON]#eleicoesrio os votos de quem tem mais escolaridade vale mais sim [EMOTICON] afinal eles não mudam de partido por um pedaço de pão [EMOTICON]Assuming I pass this exam, I need to get a new laptop. My MBP 17&quot; is too big to be useful and my PB 12&quot; is overheating all the time [EMOTICON]@elliceyi I'm going to pick up my ticket at Sonar tomorrow when the show starts, everyone else bailed out on me, but it's their loss [EMOTICON]@briascoi Y el mio! [EMOTICON]@YoungMommy - I think that's a huge part of it... I miss everyone too! [EMOTICON] Next time we just need a full day of socializing w/ each other!@looneytunes - I totally have vagina arms. [EMOTICON]Trying so hard not to get sick right now. Sore throat, bit tired, I can feel something coming on [EMOTICON]@ivanhtp ai ai, é tão emocionante ver a felicidade da pessoa com macbook [EMOTICON]@arttemisa ...es que lei explosiones, erupciones, truenos, tenebroso, santa lucia.. too junto. O quizas me asusto eso de &quot;a confesarse&quot;. [EMOTICON]@OneLuvGurl But it's too beautiful outside to nap! [EMOTICON] Have fun!@adalgiso I would love to visit NYC, never gotten the chance to though [EMOTICON]Alguém aceita, salada d cenoura com frango assado? uma delícia [EMOTICON]just seen a lamborghini, a rolls stretch limo, &amp; 2 bentleys [EMOTICON] gotta love California!!GOD my ears are burning and my head feels like ... construction [EMOTICON]@jpippert I haven't brought any school uniforms. School starts in a week - am so behind. Guess they'll start with old uniforms [EMOTICON]Hurray~ as is study hall isn't enough I have to go to another MANDATORY MEETING at 7:30. [EMOTICON]música nueva para mis oídos [EMOTICON]@JulieFBT very profound question [EMOTICON]Sitting in seat 25D on flight AA1815 to SLC [EMOTICON]@unclesean Maybe cause someone finally slipped you that whiskey you were asking for yesterday? [EMOTICON]@mothermusings you might want to get that checked. is it a full on grin or just a hint of a smile? teeth? no teeth? [EMOTICON]@pfig88 ok then I won't call you [EMOTICON]@johnfbraun Gee John... I can't believe that you really look like a geek!! [EMOTICON]@OwenC aw poor munchkin. [EMOTICON] I hope you cuddled him close until he settled down.It will be the longest delay of a Noon Project in 282 days of the project. [EMOTICON]@bapenguin Congrats man! Very awesome [EMOTICON]whilst brother and dad go to church, dinner, and to see tropic thunder... no car is the only bad part of that. [EMOTICON]@daltonstark i said no such thing. oh wait yeah i did.. [EMOTICON]@laurak hehe, except he's not a baby. I've been doing it for thirteen freakin' years. [EMOTICON]Is still watching it rain! [EMOTICON]aaaa me duele el corazón [EMOTICON]@kasei, glad to hear any response to this hack-ish idea [EMOTICON]no cut. [EMOTICON]@skycirrus Perfecto! Me da gusto escuchar esas excelentes noticias! [EMOTICON]Jajaja me quieren sampar algo que no es mio, pero tomen esto [EMOTICON]is feeling blaaaaaaaaaaaaaaaah [EMOTICON]@theguywithaface I refuse to comment. [EMOTICON]I'm on the last DVD Kyo Kara Moah! [EMOTICON]listening to, uhm, me, on http://blip.fm/solobasssteve [EMOTICON]ya se me acabó el verano [EMOTICON]@penyaskito escribeloooo.. sé malo. [EMOTICON]@patriciobruno con saberlo ya me das un pedacito de tu felicidad... [EMOTICON]@Hunee good morning -- got it the first time [EMOTICON]I need to improve my written English: I can't write without doing mistakes... [EMOTICON]Ugh i'm already worn out and its barely 5pm. @stevenpaulr that blows [EMOTICON]@disgraceUK oops sorry man [EMOTICON]I'm all dressed up but ain't got no party to go to [EMOTICON]@pauljohns - LOL, I'm not sure [EMOTICON]from @laughingsquid: http://tinyurl.com/6fmyuk [EMOTICON] Still, I'm glad that I got introduced to Las Manitas. Thanks, @lizhenry!se me está olvidando escribir. [EMOTICON]@zappos great work on my first order, but a *real* service powered company would have laced my shoes before they went out [EMOTICON]Three dead pixels. [EMOTICON]@littlemee ugh. [EMOTICON] It's still creating Artwork Thumbnails for me, so I haven't had a chance to try it, yet...Wow... it turns out that phone service in my area has been disabled because of an accident that happened... so no DSL at my house... [EMOTICON]@life_enthusiast he's my fav! but he's not coming to Canada! [EMOTICON]dia malo [EMOTICON] http://tinyurl.com/3h7dxhMy dream... To be interviewed by the local newspaper about my business (fixing both Computers and iPods). That would be nice. [EMOTICON]@BellaLucce yes!! it wears thin on me and my accountant too. [EMOTICON]y no quiero que jamás tome en brazos a mi sobrinita [EMOTICON] la odioooWorking all day today [EMOTICON]Just found my wedding dress, but no occasion to wear it to. [EMOTICON]Out front for bingo at voodoo. Just as awesome [EMOTICON]@cscan - god damn the lack of particle transporters. I would kill for some sweet potato right now. Too late for potato eating [EMOTICON]@baggiobanglio Bueno, entonces puede que salga bien el experimento [EMOTICON]@akamonty You can hate on men tomorrow [EMOTICON]stasera s'è fatto rapire dalla Ragazza con l'orecchino di perla, invece di scrivere quell'articolo olimpico [EMOTICON] domani sei esami ad UrbinoSo I took it down Blue Diamond and gave it a work out [EMOTICON] Got up to 118 MPH this time. Fun stuff!@omritoppol you are a cruel cruel man [EMOTICON] very funny indeed@Bucio ahahahah xD uuuuuu no lo habia pensado asi [EMOTICON]taking twitter break from painting my kitchen. NYC speeded me up. But, I'm getting tired now. [EMOTICON]@infante donde te inscribiste? yo quiero ganarme unas tambien [EMOTICON]Suficiente twitteo por hoy, ciao [EMOTICON]@abadfederico no da, eso habla de vos y no de ella [EMOTICON]@mortisult I got 200 pieces of vinyl and a broken turntable. [EMOTICON]Rental people did not leave townhouse keys for Mom &amp; Clay. Now 8 more people have to sleep in our condo. [EMOTICON] Grab a piece of floor...@theobon Hey! Welcome first friend [EMOTICON]@ MSG waiting for weezer to come on [EMOTICON] http://snipurl.com/3tksmWorking on my student loan repayment...now I feel poor again [EMOTICON]@ddanijel pio drugar ginisa... [EMOTICON] ne smem, ipak je bg daleko, a i 17 sati ima od kad sam ustaothat nap i didn't quite get? yeah, really need it now. my desk is not the place for it though. [EMOTICON]@brunabranco. bem vinda ao twitter [EMOTICON]@eggrollstan Oh jesus, I'm so hungry. That's no fair [EMOTICON]got busted by the next door neighbors for &quot;illegally&quot; grilling on our deck [EMOTICON] would have had them for dinner if we had enough@ql25 Sounds nice [EMOTICON][EMOTICON] jejeje tranqui que ya me pasare por el campi para verte un rato es te finde.immer noch SignatureDoesNotMatch [EMOTICON]A dormir. Menos de 48h para las Macbooks [EMOTICON]??? ????? ????? [EMOTICON]@andrewbarnett sorry, was too busy playing on my work mac to see that stare... [EMOTICON]walking around with my sister i wish that sweater was cheaper [EMOTICON]babel fish perhaps isn't the best translator [EMOTICON] I remember doing my german homework with it though! (no wonder I failed at german neh?)gotta go to work [EMOTICON]good morning &amp; happy Friday! [EMOTICON]@austin i just got done watching it. still trying to figure out if there was a plot. oh well. at least christian bale's backside was hot! [EMOTICON]wooowww meeejiiikk o_O screen notbuk gue bener sendiri. kupret! kalo gini malah susah kalo dibawa ke svc center [EMOTICON]@courtness Boooooo [EMOTICON]I think i failed history [EMOTICON] Six weeks testis really sad to be leaving the Emerald City. [EMOTICON]@airpeet: a zenéje tényleg jó, én is azt hallottam előbb [EMOTICON] talán a filmhez nem volt épp megfelelő hangulatom, nemtom@brianauton Free agent. So will there be a draft? [EMOTICON]@cfrey91 Lol. Just got around to reading your tweets. [EMOTICON]alistandome para lavar a las 6 :30 de la tarde [EMOTICON]Being sick [EMOTICON]@bencole88 that's awesome, great job!! [EMOTICON]@roooosje moet je dat niet kijken [EMOTICON]@serenitatis que mala pata!! Lo siento linda [EMOTICON]Boarding plane to Boston Jenne!!!!OMG [EMOTICON][Midnight worker [EMOTICON] etite nocturne boulot à la Madeleine [EMOTICON] mais je ne bosse pas demain [EMOTICON] Ya qq'un vers Saint Lazare dans une heure ?@CathyBendzunas or are you on Etsy? [EMOTICON] sorry...lol I just assumed because that's how I joined here from an etsy post. And, howdy neighbor!fun day in lafayette with 2 friends from IU. probably just chilling tonight. [EMOTICON]@banannie oh honey, i just saw this. [EMOTICON] been out all day. much love and hugs to you.@wesleybrasil vamos meter bronca garoto! [EMOTICON]@manolova64 puedes decirlo [EMOTICON]@fabsn Hehehe OWolfs nao chega a tanto [EMOTICON] . Ah, mas acho que ele nao abre domingo [EMOTICON]Just finished some pot roast for dinner! Now I'm playing with my son. [EMOTICON]Dam the older button works but only goes bad 3 pages [EMOTICON]@VeelaLatina nunca veas Héroes [EMOTICON]Old Loki Dog is having surgery weds! Please keep us in your thoughts [EMOTICON]@nataliah Acabe com o ano assim não, pelaamorde! [EMOTICON]@venkat_s The Prags translator hamsters must be on a roll. [EMOTICON] Congrats!@Dangerangel apparently they are no longer posting the dreams on the blog [EMOTICON] but they say they will hang onto them for further researchers.Mark makes me happy. [EMOTICON] Bed now. Night world.@tamismith [EMOTICON] I'm sorry!Thanks @cabri ! Problem fixed. [EMOTICON]@HoosierGirly aah let him play through the pain, how else is he gonna be prepaired for the NFL. [EMOTICON] Im depressed send me pizza [EMOTICON]@Viss - happy early birthday! [EMOTICON]@CLIC6608 Thank you! [EMOTICON]@dsaarinen thanks girlfriend *hugs* [EMOTICON] how are you?@willhallmusic, I'd be jealous. [EMOTICON]home sweet home [EMOTICON]@toshita: el &quot;it´s not you it's me&quot;, nunca se acostumbra uno. Igual, ya va uno aprendiendo [EMOTICON]@soldierant yeah, and we have no wiggle room b/c I cannot find any more spares [EMOTICON]RIP Doodle [EMOTICON]needs a break from Facebook. If you are reading this on FB and I owe you a reply to something, plz 4give me - I'll be back soon [EMOTICON]@tomaspollak a la hora que avisas po tomás.. [EMOTICON] tengo una reuna a las 8 sorry.. avisa antes :ahy::HELP: alguém ajuda aqui [EMOTICON] http://tinyurl.com/56molgObama will be on for a 1/2 hour tonight V for Vendeta style!!! [EMOTICON]okay me signing off, need to get ready 2 office [EMOTICON]auf der konferenz sind keine partyleute oder leute mit humor [EMOTICON] langweile mich etwas. bunterhund-phänomen wieder. gibts party in wien?Remembering Good Times in Italy without the extra.... Well, good times. [EMOTICON] (Part 46 of 310): http://snapmylife.com/p/1462895iPhone problems continue [EMOTICON]@davepreston I like that idea. i was planning to make the set private on flickr, but I'll consider it . . . we'll see how they turn out [EMOTICON]@rebellion NO [EMOTICON] u kan bruke ldid til å fake-signere app'ene dine om du har en jailbroken 2.x device. installer via apt-get på telefonen [EMOTICON]@jimmygle so only 1 person in your dept has a brain? [EMOTICON] jk...@mcddjj oh, go eat some &quot;brownies&quot; or something....wait, they got CONFISCATED. ha ha [EMOTICON]Party pics depend on the weather. Might be canceled when we get up there. [EMOTICON]me dejo liar muy facilmente.. Sevici &amp; Sloopy &amp; Beers &amp; Futbol &amp; Sevici &amp [EMOTICON] ucha allá voy.. [EMOTICON]Moving into my new apartment on campus housing tomorrow [EMOTICON]Someone I really love is in trouble and there's little to nothing I can do to help. [EMOTICON]@rafamontoya yo tb me he aficcionado al footing... tanto es así que me he hecho una compradora empedernida de running [EMOTICON]@dezguy sorry Mike [EMOTICON] Left you a message and tried to call Louis' but got voicemail.Gas is now 2.29 at the Speed Mart, wow. I love warring gas stations [EMOTICON]@MarcosCohen eu estou começando a desejar ter visto Chicago... [EMOTICON]Ran out of cookies [EMOTICON]always thought the movie &quot;Hardware&quot; was pretty cool. Until... global warming happened for real [EMOTICON]good just wanted to me sure. I get a little goofy after a few drinks [EMOTICON] I'd love to join you but am at dinner w/kids now. Enjoy!@megbar yes. So long as both parties can handle it, yes. [EMOTICON]@Grundy yup, I'll be 42 tomorrow. No biggie though, all the good birthdays are long gone for me. Tomorrow is just another day at work. [EMOTICON]just got back from the store so we should be able to find something lol! maybe watermelon and ice cream sandwiches [EMOTICON]so por hoje... [EMOTICON]is up n hungwee... Didnt eat dinner [EMOTICON]@andrewNewland if you have a blank cd I will burn you one tomorrow. I'm out of cds [EMOTICON] it's pretty good.Wiff a few friends playing rock band [EMOTICON]is asuma really dead? omg so sad! [EMOTICON]I'm about to do something that I really don't want to do. [EMOTICON]Or maybe, just maybe, my work just rocks! [EMOTICON]Well, todays off to a good start. [EMOTICON]Going to go do homework. [EMOTICON]Leer las ultimas actualizaciones en mas de 200 blogs en una sola pagina? Hmmm. [EMOTICON]Is saddened that another blogger plagiarized, word for word, my copyright and attribution requirements. How ironic! [EMOTICON]Watch Conan get crapped on tonight it was halarious! Dinner then Comedy Club [EMOTICON]@javajive you just realized the crazy part? LOL, would've thought you already knew. a good monday tho [EMOTICON]Is enjoying time at the campground with his sleepy grandparents. [EMOTICON]persze ebben nem látom az előnyt @livililli részére, de ez a része nem aggaszt [EMOTICON]Yay! Goes well with my evening we're-too-cheap-to-put-the-heat-on tea. [EMOTICON] Why are you peanut, anyway?Ewwwwww I have to get ready for school tonight. Gross. Feel for me followers. Feel for me [EMOTICON]@emerluis próxima batalha de ipods? não que eu queira participar, mas existe a possibilidade de mandar uns blips? [EMOTICON]@krudweiser didnt even get to use my crowbar today [EMOTICON]@charlyjl Good morning [EMOTICON] My day has been good. I hope you have a good day too@errica I can't have more...all parts have been removed... [EMOTICON]Llegue a casaaaa! Ha sido el peor dia de la semana, pero como decia Saulo, a sonreir, que nadie se imagine que puedes sufrir [EMOTICON] I miss youu!@matc1984 Why not today? [EMOTICON]another day with the 90-two [EMOTICON] http://tinyurl.com/6j7fge@pakuz pero despacito [EMOTICON]Getting dressed to go out. Wishing I was staying in [EMOTICON]@anarina se vc mudar de nome para &quot;encontro&quot;, acho que eu me animo a ir! [EMOTICON]@jmholland - speaking of reviews, I owe John/TLN a book review. Due today... gonna be a tad late [EMOTICON]@scottyb420 [EMOTICON] hehe. I'm 22!!!THIS NEWS BULLETIN JUST IN: A grouchy September wasp is in our apartment, starving on our Venetian blinds [EMOTICON]please just let him be okay [EMOTICON]@Transition That's pretty lame. [EMOTICON] Any word on the new locale?a gal is watching the hills in her laptop..instead of reading her notes. [EMOTICON]@Conner23 scary! [EMOTICON]is glad the mothers looking a bit better and is excited for camping on tuesday [EMOTICON]Lol, there's a Simlish version of &quot;Good Day&quot; by Tally Hall on The Sims 2 Apartment Life. Another reason to get the game [EMOTICON]Aliás, já tenho Warcraft III. [EMOTICON]@FengShuiFancy Thanks! Yes, we need to spread the news about Feng Shui and create a better, calmer world [EMOTICON]stamp collection - giving stamps to students [EMOTICON] stars or some other image, #mmnz08@Ryck Pero si son solo 20 minutos [EMOTICON]Just heard, Richard Wright, Keyboardist for the Floyd Died today at 65. Very sad. [EMOTICON]printed out lots of information to study while i work out. Now that's multitasking. [EMOTICON]Each tweet a haiku / a monster is created / your poem's better. [EMOTICON]@ScottWilder hey, we agree on not voting. [EMOTICON] http://is.gd/3p2i http://is.gd/3p2jnew pic [EMOTICON] haha@Zentaurus :O Mi polola viene viajando de vuelta de Villarica ahora [EMOTICON]Car battery dead like well dead. [EMOTICON]@chriscoyier what's up with the css-tricks forum? It's all new and I don't exist [EMOTICON] ?@MarkHansen -- I just saw you on the forum that I replied to you in. You do great stuff in BANS. AWESOME. [EMOTICON]poking around stackoverflow.com (whee i love betas), looking for an answer, also looking for bugs, cant seem to find either [EMOTICON]ruecken beim husten schlimmer - also huste ich nicht [EMOTICON]it's FREEZING in my apartment [EMOTICON]can I get a hand with it? [EMOTICON]is having a study break... pweh! [EMOTICON]Retweet @beckinoles: can't wait to go here on friday!! http://ping.fm/bimW6 i can't wait either!!!!!! [EMOTICON]@JooleeAnnA Sorry so long [EMOTICON]@theoneinpink I'm amazed how quiet you've been about palin today!! [EMOTICON]Just got a TON of work for my freelance job! Thank goodness I'm on leave from the day job! [EMOTICON]uhg. Can we pls talk about strategy again? Finance is soooo not one of my passions. Wanna build strengths... This stuff demotivates me [EMOTICON]@audiodisco Shit man! What did they grab? [EMOTICON]ran a TERRIBLE race. [EMOTICON]@barkingcarrot never been to a bar with you but I'll give it a read [EMOTICON]coffee cake proving to be a bad idea... think I need a nap [EMOTICON]@wenwhit tomorrow will definitely be that!! no worries, got that covered...you'll get status updates [EMOTICON]@Pistachio in my apartment in nyc, doing homework. [EMOTICON]@ShepherdDad - Sorry to hear about your Zune [EMOTICON] I love my 120GB!Intense day of video editing. Still more tomorrow. And Friday. Almost done, though! [EMOTICON]@djgallardo I thought @nsa was following me because they wanted to be friends [EMOTICON]@mdbraber, @endamadden yeah, same topic thing happens occasionally [EMOTICON] - outcomes another way of defining value no? to whom is the questionMinha irmã biruta conhecendo o twitter [EMOTICON]@mono_7068073421 they made a sad. [EMOTICON]oh hey, McCain is gonna be on campus on Friday morning. watch there be like... no parking [EMOTICON]@tofu916 you are on a roll - don't stop [EMOTICON]@chakkaradeep heres hoping for an awesome IC09 [EMOTICON]Ser un macho man leñador ya me trajo dolor de cuello y una ampolla en el dedo [EMOTICON]i want to take a bath [EMOTICON]@140story [EMOTICON] chillingly appropriateAt the Winchester (finally). [EMOTICON]@LaPaoSalmon no vas a poder llegar hoy, verdad ? [EMOTICON]taking Maggie to Babylon AD (now that homeworks done [EMOTICON]O plugin similar posts resolveu não funcionar mais no Saiba Tudo [EMOTICON]Playing Texas Hold'em. Too bad this isn't real money. [EMOTICON]@AsierMarques de cualquier modo voy a seguir investigando [EMOTICON] si t enteras de algo me dices xDDDuro día de trabajo hoy... no me apetece salir [EMOTICON]just broke my sunglasses [EMOTICON]Oh! UPS just dropped off my Obama poster! Yay [EMOTICON] http://is.gd/3K46 Now, to find a frame...@collindonnell Is Lingo Bingo awaiting approval? iPhoneLemurs.com says it's available, but the store disagrees, and I want to try it out! [EMOTICON]@adzap Sure did, then spent 30 minutes writing clearer instructions - and accidentally overwrote them [EMOTICON] Will do it again.Hoy he recibido tantas visitas aqui en el trabajo...me siento popular... Cualquiera que venga a Multi Escazu... son bienvenidos en Hossli [EMOTICON]Nieves argentinas. Te echo de menos mi buen amigo Esteban. ¡Tanto! Septiembre está muy cerca [EMOTICON]@pablo_acme A todo esto... hace tiempo no viene Cueto a trabajar ¿eh? Su helicóptero no ha aterrizado... ¿o se viene a pata? [EMOTICON]@Tucson_Cowgirl I like your cheering squad! I'm thinking you can throw confetti that is also edible, kinda like nilla wafers [EMOTICON]@Rulopanda ja ja ja chata... si, ya lo quería borrar, pero lo tengo nomás por amigos roñosos que no se pasan a facebook [EMOTICON]@karmi ahhhhhhhhhhhhhh!!! [EMOTICON] por qué no? Es muy divertido n_n. Y beneficia a tus muslos :$O VirtualBox está a ficar bom, mas falta-lhe uma rede virtual com o localhost como o vmware tem [EMOTICON]Is on her way home from the game freezing wig starbucks in hand. [EMOTICON] god is good for giving us starbucks.i went back into iTunes, the book is Good to Great, going to download now [EMOTICON]oooohh @clicia que gran sacrificio!! ni de coña bebia yo cerveza ahora!! que mal te lo montas!! [EMOTICON]@NOLAnotes @Soulprncs2 cooking chicken parm for dinner. lemme open my wine and i'll watch [EMOTICON]but I don't want to go to the Yelp.com Birthday pARTy tonite ... [EMOTICON]@digitalsista - oh I would love to see you there next year! [EMOTICON] It was definitely worth the trip - I'm already planning on BWE09! [EMOTICON]@beatrizmorgado [EMOTICON] eu que fico feliz de saber que vc é mais uma twitteira nesse mundinho@aletha wondering if and when there will be a trash the trousers? Slam the slacks? Beat the britches? Jam the jeans? Sign me up! [EMOTICON]There's no good movies on tonight, and Adult Swim got rid of Old School Friday rather quickly. [EMOTICON]CU Buffs are in meltdown mode [EMOTICON]Damn Flies [EMOTICON] http://blip.fm/~cml1Retweeting @: My twhirl gone bad. Not showing the nicks and profile images. Why oh why!? Mine too. [EMOTICON] note the @ sign your nick is missing.@tjmaxx i'll follow and hold you to that! [EMOTICON] Keep up the good work... (and im curious on the the conversion success of the links)Somebody likes my photos [EMOTICON] http://twitpic.com/8t4plied: ate some fast food, played some Rock Band 2, and is NOW heading to Reddz's for PAs [EMOTICON]At Pizza Hut... For charity. [EMOTICON]only 4 hrs to go! ...i'm getting very excited! [EMOTICON]Dando forma a unos endecasílabos que llevaban mucho tiempo acumulando polvo. Ahora veran la luz del nuevo día. [EMOTICON]@fox88 Hahaha lol! Onde eu tou, tb nao recebo recibos, mas tb nao preciso.isso smp é bom, se nos lixam fazemos keixa nas finanaças [EMOTICON]@Numanmania yo ayer me baje toda la T2 [EMOTICON] acaba de terminar el capítulo 7 y creo que me voy a echar el 8 [EMOTICON]@christopherm thanks for adding @george_weather ! very cool idea! [EMOTICON]I am surrounded by weirdos. [EMOTICON]tomando leche con proteins porque no hay bananas [EMOTICON]Bike ride, picnic &amp; mini-nap at town lake, dinner, Religulous, wine &amp; cuddle time at Home...Yesterday was as perfect as it gets [EMOTICON]Good night Berlin ... We love you [EMOTICON] http://snipurl.com/4bzgc@r3v heh I should totally not have started this on a forum with 140 chars limits. [EMOTICON]omg I just saw the saddest thing in the world!!! A fucking dog got hit by a car [EMOTICON]@karaemurphy This is the one I want [EMOTICON] http://bit.ly/3MfKx4@saborkt cool! Glad you didn't vomit if his mom was there [EMOTICON] LOLToday's and yesterday's Wikpedia Current Events is all depressing [EMOTICON] http://tinyurl.com/haszxMalditos juegos... Los vi hasta tarde y todo para que perdieramos!!! [EMOTICON]@JaiMami I didn't know you had a VA business. [EMOTICON]Apple: when are you swapping the faulty NVIDIA cards on the Santa Rosa Macbook Pro's? I got one of those... [EMOTICON]DOGstyle! [EMOTICON] http://blip.fm/~6mpx@rzamana [EMOTICON]toilet training today - 3 year old and little girl was very keen so we are all one big &quot;happy&quot; toilet training family [EMOTICON]DONDE ESTA MI PUTO PAQUETE ESTAFETA [EMOTICON]My feet are cold. [EMOTICON]Mas ficar em 3º lugar geral dos sumulados, em três salas de semi, é uma coisa boa [EMOTICON]@futureweasley [EMOTICON]@glmendes Opa! O negócio é seguir quem você conhece e quer conhecer, pra participar das conversar coloque @nickname e responda [EMOTICON]I'm saaaad about Travis Barker.. [EMOTICON] Hope he makes it! Going to a hocky game tonight, then PDA. Yaaaaay. [EMOTICON]@jrhowa i think he was responding to sisterhood of the traveling pants... [EMOTICON]@MikeLefebvre just looked it up and @laniar is a 97.3 and @respres is a 99.2 while I&quot;m just a mere 87 [EMOTICON]@daialeide eu quero uma zombie walk no Rio.... [EMOTICON]hey sd last night I met some cool diegans, say hi to @sunnygault @joshallard &amp; @kcalumpit - they used to the show Viral for Veoh [EMOTICON]@letsridebikes i know....too bad you arne't here to slap me in the face and tell me to stop being stupid about it [EMOTICON]@RobSummit He is 1 year old i am hopeing his hand will not scar too i been burn before on my back I know right now he has to be scare. [EMOTICON]Our poor dog has lime disease probably from a deer tick. It's nice to have deer walk thru our yard but not at Duke's expense. [EMOTICON]écoute Max et les habituels de Gérard qui charient Bruno (rouler en vélo avec la roue avant, vider ses sacoches, etc.) [EMOTICON]@meghann Yikes. Hope it kicks in...! I'm a Maxalt girl myself. [EMOTICON]@lubom e aí, já sentiu algum efeito? [EMOTICON]@GrammarGirl Even words like &quot;egregious&quot; [EMOTICON]افاااا .. نسيت دفتر الملاحظات حقي في كوفي تيانا [EMOTICON] .. الله يستر لايطب في يد أحد ويقراه [EMOTICON] [EMOTICON]@cognizance you can [EMOTICON]No plumbers today. [EMOTICON] near Home http://tinyurl.com/5n2oaeescuchando musica!! [EMOTICON]@Surrealistique 100% pure awesome [EMOTICON] going a little crazy. could use more sleep. maybe a clone. but 100% pure awesome [EMOTICON]@vitorhugo uahauhauhauha [EMOTICON]lol - to those curious: ill be sure to make a big shout and fuss about it once it's confirmed [EMOTICON]Just finished switching the wardrobe from Spring/Summer to Fall/Winter and got together a bunch of stuff to sale. [EMOTICON]@tinainvirginia oooohhhh ahhhhh [EMOTICON] http://blip.fm/~5f9sperdí mi teléfono [EMOTICON]many new homemade pixie tarts melts listed, in many scents http://www.blujay.com/dancingsong have a look [EMOTICON]@NatalieGelman Still have your CD tunes prominent in my iPod. [EMOTICON] &quot;Never Had You&quot; is still my favorite. [EMOTICON]@thoroughly_mad indeed, if it has any color at all it will be more than mine has [EMOTICON]talking to kat [EMOTICON]@zether you've got it [EMOTICON]@skycirrus te gusta la fiesta de espuma? [EMOTICON]I &amp;lt;3 the new WordPress site. it's shiny [EMOTICON]@chickgonebad I know! Do Enochian in order to do pr0ny things with Doctor Who? [EMOTICON]@Dayngr You saw right through me! Anyway, I'll vote for you. [EMOTICON]One computer so many cables ! [EMOTICON] - Photo: http://bkite.com/00X8m@hippik tak to sucks big time [EMOTICON] get well soon... kde je kurva batman, když je pot?eba? [EMOTICON]@blindllama i can't take too much more of this week [EMOTICON]@Blu más que eso! soy megatapatía [EMOTICON]@curtismchale ooh. well, those just come with the computer world territory. [EMOTICON] i used to hate viruses...and had no problems on a mac. [EMOTICON]@LindaSherman Linda, is it bad for a man to say he's looking forward to seeing the movie? [EMOTICON]@hapahoney Twitter hasn't been working on my blackberry for the past few days...so no tweets. [EMOTICON]fixed the org's myspace page. Woo hoo! This day ended up not being so bad after all. Pat on the back for me. [EMOTICON]Yes I do [EMOTICON]ugh, if you ask me to do something &amp [EMOTICON] o it, that doesn't give you the right to complain when I did exactly what you asked me to do [EMOTICON]Leveled my druid to 60 and bought my epic land mount! Decided it's time to do homework though... not doing anything fun tonight. [EMOTICON]@Zegi a esos iconos les falta (la manzanita de Apple) y (el simbolo del comando de Mac) [EMOTICON]This OneNote installation is crushing my computer/browser performance [EMOTICON]Off to bed feeling worn out [EMOTICON]soy latte mmm and a whole new day at my fingertips - maybe today I can do something grand [EMOTICON]@jpostman that was a great post you did but I didn't have proper time to digest - kids are crazy tonight. Catch it again at bedtime [EMOTICON]@the00rig That is some full day, what you doing tomorrow curing cancer [EMOTICON]uhh.. cs4 trial is out [EMOTICON] leslie and me are downloading it [EMOTICON [EMOTICON] wowie!8:00 sat morning...let do the 5 or 6 mile hike we did last monday [EMOTICON] Mary@n9vls nooo, that's *tomorrow.* [EMOTICON]@zone41 tás sempre a dormir [EMOTICON]@pistachio sorry you feel that way - cuz I am rockin' a mullet at the moment. [EMOTICON]@hfiguiere phew! was worrying that ufg might be required to unfollow rfb [EMOTICON] ... relieved to hear u remain unwindowed [EMOTICON]btw the song was &quot;Loaded&quot; by Ricky Martin off the &quot;Loaded&quot [EMOTICON] [EMOTICON]1:40 from Cardiff to Swansea. Un-be-lievable [EMOTICON]busy trying to sort out all of this mess in my videos... too many... and it's freakin hot in here... arrrg, need water [EMOTICON]@ryn0 i was playing spore on my phone [EMOTICON] hahOn a plane to Amsterdam, reading about the Finnish college shooting on Jaiku [EMOTICON]thrilled to have pulled off a surprise SKYDIVE and birthday party for my man!!!! What a FANTASTIC weekend [EMOTICON]I'm in a bar with no tv. No Obama for me [EMOTICON]@pollyparnell ya it's sad [EMOTICON]hanging out with friends [EMOTICON]@szilveszter azért ennyire tán nem rossz a helyzet, winfikázásba még mindig gyakrabban szoktam belefutni [EMOTICON]@SarahWV [EMOTICON] great news. are you running Vista?@waltribeiro hey if u get a chance look me up at http://hellahansum.ning.com/profile/apostle i have got music on there, im a rapper [EMOTICON]Sewing a little pillow/bag for my niece. Think it should've been a Christmas present. It's so late. [EMOTICON] But she'll love it!C&amp;C after a long struggle with MediaMonkey. I think I lost the war and have to rebuild my sfv files. [EMOTICON] tagging here I cum!De volta da praia. Hora de montar um micro novo pra minha mãe. [EMOTICON]@karolijn It's on CBC, ya know. [EMOTICON]@bitchinmona ohhh, that's so much cooler. [EMOTICON] damned my dorky self-conscious... maybe it's just my carb lover since it's just that one lineGetting picked up for the trek out to Rhino Records Claremont for the Evangenitals in store show! Yee-haw!! [EMOTICON]prin urmare, nu pe citate, pe .com [EMOTICON]@blacksnob thanks. [EMOTICON]@Hisaux Moi aussi je trouve que ça ne sert pas à grand chose le microblogging sinon... [EMOTICON]@HannahMcNamara [EMOTICON] osted it in a couple of places [EMOTICON]@happyeli Hehe, I was thinking that too [EMOTICON] Great single minds think alike!@vivalalelo foda-se, repressor [EMOTICON]@pillworm are you? [EMOTICON]@juanvalentini: Si tienen alguna pregunta especifica, adelante. Vamos gente! Juan esta dando una charla sobre PR 2.0: FEEDBACK. Pregunten [EMOTICON]há! primeira bronca que o bob obedeceu! [EMOTICON]Na verdade o MSN conecta, mas não consegue receber a lista de contatos. Por isso não abre. [EMOTICON]All the Christian fundamentals will vote for Mrs. Palin as Bible Spice. Very helpful! [EMOTICON]@artklick $174 k logo LOL I would have loved to see the creative rationale [EMOTICON]@seanabc in some other small southern town there's a rule against taking your alligator for a walk. can't remember where that was, tho [EMOTICON]In overdrive for ARTISTS BALL 7 this Friday. Don't know what's better, Mos Def or the open bar [EMOTICON] http://tinyurl.com/4stahy@JulzM Good to see your familiar avatar back [EMOTICON] BTW half the potatoes that I cooked in the micro were underdone, but there was potentiale minha mae ja comecou a gritar [EMOTICON]@sahaskatta you suck [EMOTICON]Me voy pal sobre gentecilla, mañana será otro día, otro día igual?, hope not! nn [EMOTICON]@shaun11 great, but I'm enjoying it in my house [EMOTICON]@quietish Lol [EMOTICON]to super me identificando com o Homer e seu drama a procura de sua alma gêmeas... mas ele descobre que é a Marge no final eu n [EMOTICON]is looking forward to hillary's speech tonight! [EMOTICON]Finally arrived at home in London. I'm awfully tired [EMOTICON]lol, dont get all mad, we know what happens when we get mad at each other [EMOTICON]@FHAZ Sempre bom ver seu blog miga, novidades mil e sei que da o maior trabalho [EMOTICON]@PaulinhaZ minha atleta preferida! Se for top 5 no IRONMAN do final de semana, o patrocínio tá garantido... [EMOTICON]Say goodbye to the blonde hair tomorrow [EMOTICON]my new Cole Haan shoes with &quot;air&quot; technology aren't that comfy... [EMOTICON]Dr. Dre's 20yo son dead [EMOTICON]@kelevance That is a lot of clothes, when do we get to see pics? [EMOTICON]24, Day 5, 17:00, Silent Clock. Wie weet zonder te spieken voor wie? [EMOTICON]No ni, tätä on venattu: rantabulevardilla käy lämmin tuulahdus, oma poppi soi ja paikallinen punkku maistuu mahtavalta.. Life is good [EMOTICON]&quot;Exciting&quot [EMOTICON] hysics lab. Horray [EMOTICON]En Callejeros, haciendo zapping,el tema es interesante &quot;Funcionarios&quot; .. Pero la fofrma de enfocarlo es &quot;sensacionalista&quot; [EMOTICON]@benjaminleonard when has a catch-up portable ever held a candle to an apple product this quickly [EMOTICON] wait for MS to buy RIMBon, j'ai programmé plein d'articles sur mes blogs pour les prochains jours. Je peux aller me coucher tranquille. [EMOTICON]I missed the baja blast so much [EMOTICON]@luishandshake you're so precious...you'll be amazing! [EMOTICON]se je vrnil s koncerta v Ortu...bilo je noro dobro! [EMOTICON]I'll be streaming live tonight! [EMOTICON] HUZZAH! Now hopefully I'll have the same audience. @mogulus You hear that? I'm streaming!!!@spiritualtramp makes sense - would be hard to be a serious Christian and not [EMOTICON] I fall into none of the 3 camps.. if i hear another usb-disconnecting noise when i haven't touched anything, i'm going to freak. [EMOTICON]@amyderby So now you can think of me and @thedublab and all, this winter, whenever you're feeling disgruntled with your own climate [EMOTICON]@dimuthu: yeah, it's fun. That's y I do it all the time. You should giv it a try sometime [EMOTICON]the sla renamed me lol [EMOTICON]Google Chrome. Great time to be a JavaScript developer. Anyone looking for a great JavaScript developer? [EMOTICON]@mcannonbrookes but the table-based layout of Confluence, it HURTS my sensibilities [EMOTICON]divorce sucks [EMOTICON]Good Night! [EMOTICON]「あしたまにあなって」明日に間に合のほかに「hasta manana」をかけてたって、今気づいた。オソッ [EMOTICON] 番組終了しちゃってるのにぃ。またやらないかなぁ http://www.tv-asahi.co.jp/ashitama/@domestic_diva OH NO [EMOTICON] And I hate to hear she got sick..I'm praying for a new donor SOON!!! (((HUGE HUGS)) for you and Marielle!@LipeGilard Sempre que precisar, estamos aí! [EMOTICON]Ya me voy a ver a la banda, no llego a la hora inidcada, pero de que llego, llego, jejejeje! [EMOTICON]los dejo hasta nuevo aviso [EMOTICON] byezzzz y ta loigooo@Nojenrobso I dunno. It makes me feel vulnerable. [EMOTICON]Missing @shaneduffey [EMOTICON]@madd0 Avez-vous l'âge en commun ?? (mais non, j'te taquine XD) ... ms je dois avouer que bien que ce soit une comédie musicale j'ai aimé [EMOTICON]@thepinkc I love my Firefox too much to ever switch right now [EMOTICON]is not looking forward to next week - Fan Fair... [EMOTICON]Maria Eduarda nasceu de peruca [EMOTICON]@billenglish [EMOTICON] LOL no, it's a mirrory como regalo le picare a los liks de su adsense jeje [EMOTICON]@CoachDeb has to slave away on her book while we party at NME. Been there, have that T-shirt. [EMOTICON]@RuthEllison then don't stop!. phh I don't it's easy! [EMOTICON]@tankgrrl Can put feelers out when ur ready. U make a lemo to esata test cabke to chk yr pins first? RED guinea pig can be 1st customer [EMOTICON]Chilling @ the rhino. Feel free to pop by. Queen west is so weeeird. @darcievany and @markjaquith will be by later [EMOTICON]I'm gonna upgrade my mini, new HD, N wifi, possibly some overclocking....Now all I need is the money [EMOTICON]Haciendome una cuenta en Word Press [EMOTICON]I am NEVER getting behind on clipping coupons again. This SUCKS. On the bright side, I now have a copy of Breaking Dawn [EMOTICON]@veen what you got cooking? I thought you were taking time off. [EMOTICON]@zone41 se tivesses Nikon podias contar com a minha assim.. nada feito. [EMOTICON]@tunix hop bi dakika, benim memlekette ne yapacan [EMOTICON] nakliye ha?@americanvirus another good Sunday song - heck it's Sunday, you get 2 ! [EMOTICON] http://blip.fm/~6mrl@Scarlet_ nervios de punta [EMOTICON]@whateverwillbe WOOT! You go girl!!! Hey btw, was Beki jealous or what? [EMOTICON]Kijk de laatste aflevering van 'everbody hates chris' eerste seizoen. [EMOTICON]@Mike_Linux_NL Good for you, Mike! [EMOTICON]Ihave always rooted for the underdog = the cardinals [EMOTICON]Eating honety mustard chips on elysses floor is fun [EMOTICON]Wow, Scicos seems to be really nice! [EMOTICON]uff tired but its complete at last [EMOTICON] http://PNTdesign.pt.vuSeriously only gets one 15min break 2day. And not till 4 [EMOTICON]Reading Guitars and Gaming was the kicker. I need to buy a new ax and start playing again. An Epiphone Les Paul might encourage too. [EMOTICON]Hoy me levanté escuchando a David Bowie [EMOTICON]@monicawright Heh, that was a good seven years ago now [EMOTICON]congrats to those that finished the twitter contest.. just got back from vacation and finishing a 15+ hr drive [EMOTICON] Bed time [EMOTICON]@fortheinsane I hear ya! I got a bad headache and 2 black eyes from allergies right now [EMOTICON]Plugging in a movie. 27 Dresses sounds good [EMOTICON]*kisses my photoshop goodnight* [EMOTICON]@marielademarchi ...guarda che io poi ci credo e ti ascolto eh! [EMOTICON] Vado a dormire vah, che è meglio! A domani (cioé oggi, vabbe')... ^_^mas masarap ice cream ng pinas kesa d2 sa states, ice cream kau dyan [EMOTICON]Kinda hanging out online. I've got some work to do on my finances, but I'm wishing for something to do on ustream or Talkshoe. [EMOTICON]the new facebook and I are now friends [EMOTICON]@ericmatz see...now there's a man that can see where I'm headed. [EMOTICON]@eduo &quot;sangre sudor y lágrimas&quot; eso es dejarse la piel por twitter! [EMOTICON]Just went for an awesome swim in the lake [EMOTICON] Looking forward to hanging out with my sister and her boyfriend tonightfeeling crabby [EMOTICON]Watching TV [EMOTICON] YAY Tomorrow is Friday!! ^_^rehearsal waits for no double ear infection [EMOTICON]Still waiting on our album &quot;The Missing Ingredient&quot; to arrive from the manufacturer. [EMOTICON]After sleeping on it, I'm still very happy with my short. Don't know what I'll do with my nights now. [EMOTICON]Tenía tanto tiempo sin comer una hamburguesa que siento que voy a estallar.. [EMOTICON]Ya no encuentro mi foto de hace un año con mi sombrerote y mi botella de tequila [EMOTICON]@jordanbrock yes true [EMOTICON] i can't win. we might go for 8pm next time then@ the baseball game [EMOTICON]@kiwichamp I like cameras when I am taking the photo, but not when I am in it!!!!! [EMOTICON]Two people in baton rouge died from a tree falling on their house [EMOTICON]@whiskito deja si estoy con los apuntes y una cosa que acabo de encontrar... gracias de todas maneras [EMOTICON]@technosailor: THE Cream of Crab soup, Aaron? Happy Birthday, handsome [EMOTICON]Wondering if Goofyfootmom is wondering that about my project? And if she'll share her poll results when it's done. [EMOTICON]I really have to fix the automatic acct selection. I keep sending from the wrong account [EMOTICON]@guite Re:4 jours.. Rassure-toi, tu n'as rien à envier à personne, crois-moi... sauf peut-être la semaine de 4 jours...!!!! [EMOTICON]Walkin' around Wal-Mart. [EMOTICON]Waiting on the wife to call sayng she made it safely to CLE. [EMOTICON]@heyjudeonline happy birthday!!! [EMOTICON]hates it when people are mad at her. [EMOTICON]de nuevo problemas en el server USA [EMOTICON]@mattcutts just said 'that's hot' - giggle [EMOTICON]@hackand de que tipo de plantita estamos hablando? [EMOTICON]@bassred I believe it was a joint effort between @ialbert and my 5 pounds of fish and chips that swaued you to the fish burrito. [EMOTICON]estoy cegato de cerveza y veo que necesito una segadora industrial para afeitarme la barba, estoy deprimido [EMOTICON] me han jodido vivo&quot;...that me in the corner...&quot [EMOTICON] purely fictional of course. I've always been a heathen [EMOTICON] )@hasmanyjosh ... welcome to the East Coast btw ... nice to have ya over here for a bit [EMOTICON]@daz_angie yo soy uno de ellos [EMOTICON]@Mels_World Ohhhhhhhhhhhh I wanted to be there so bad ... you will have to keep me informed of what is going on [EMOTICON]GONG TO MEET MY SISTER AND MY TOTALED E CLASS BENZ [EMOTICON] THANK GOD SHE IS OKAY.. AHHHH!@partridge Good luck! I like it when I see people confident going into tests! [EMOTICON]@Whit_Chamberlin yours too or just matt's? total sucko [EMOTICON]@micah Honey, you *so* win. You are king of da geeks. [EMOTICON]@yuuup!!! [EMOTICON] das good to hear.. Like I said I been rootin for Dallas too since the tuna was there so I'm very familiar wit teh teamgetting ready to do my homework and then DESPERATE HOUSEWIVES hahaha can't wait!!! [EMOTICON] then bed and school! 423-7264 ---&gt; text me!baru dapat musibah [EMOTICON] mohon doa dr temen2 supaya @kaitou bisa cepet mengatasina, amin [-o baru dapat musi.. http://tinyurl.com/4xnaosWow 350Designs site shoeguru.ca was shown in Smashing Magazine http://tinyurl.com/5uc8pu [EMOTICON]@grantruby I took &quot;Mark it, dude&quot; as a guarantee [EMOTICON]I was wrong, its 'jesus rock', it gets worse [EMOTICON]@Klutch27 Youngin. [EMOTICON]@marcocampos I'm a pygtk fan myself... [EMOTICON]@shadow_studio Jajaja, lo vi en la foto de una revista de EEUU, y lo buesqué [EMOTICON]Remembering Good Times in Italy without the extra.... Well, good times. [EMOTICON] (Part 31 of 310): http://snapmylife.com/p/1462679Had another fun scrapbooking day today! Am also thinking and planning my next big project...A Christmas present for my mom... [EMOTICON]@oceanit Our next session is tomorrow...but, I'm missing it... I have to go to the doctor in the morning... [EMOTICON]@conraddecker we can still be friends [EMOTICON]@jordanbehan oops, I thought you meant wifi mesh point. Flips I still covet. [EMOTICON]@davidrosam lucky you [EMOTICON]@Fotomaf cydia ha actualizado sqlite3 y se han cepillado el GRiS, fyi... [EMOTICON]I feel inspired [EMOTICON]ay ay ay muy amigos ay sí [EMOTICON]listenin to awesome music!! writing my research paper [EMOTICON] im also very hungry!@christinelu you go grrl! banish closed-mindedness and &quot;journalists with their game face on&quot; everywhere! [EMOTICON]AND the Dollhouse site is supposed to be live, but I can't access it. [EMOTICON] http://www.dollverse.com/ño ñoje [EMOTICON]@edgarin bn bn grax [EMOTICON] ayer nos estabamos acordando de ti, junto con lalych [EMOTICON] haber si vienes para el ENLi@MichaelTsang score! I just found an apt in Park Slope. I LOVE IT THERE! It's only for a month though [EMOTICON]@edkaye *hwwwwp* i mean...hope you get better soon! [EMOTICON]@daligt justo me entró curiosidad de saber como iba tu terraza [EMOTICON]warte immer noch auf mein iphone [EMOTICON] Tag 17 [EMOTICON]Back on broadband [EMOTICON] Should I write a short report on how to connect to internet, away from home, with only a laptop, no subscribe a/c etc?Help us name our little robot love child [EMOTICON] http://snipurl.com/43qn9Wish I could join you all in Chi Town for the concert tomorrow! [EMOTICON] [EMOTICON] Make sure that you tell Smitty &quot;HI&quot; for me Amy! [EMOTICON]@ bluemama joe and i were listening to them on the way to the grocery store. [EMOTICON] i love them too!@luckyfella thanks ken! We'll see tomorrow! [EMOTICON]uh oh. not good. been eating right. today was extremely stressful. both bones and stomach hurts. and the semester hasn't even started yet [EMOTICON]Mugre! yo queria asistir a #ccguatemala [EMOTICON]@remodelthislife I know and now I have 2200 SF I need some ideas for [EMOTICON]@stuarthenshall [EMOTICON] http://phweet.com/MIL1 I will turn you into a twitter and Phweet star... Is a promise!Going to ashley's wedding. [EMOTICON]@hpduong Don't! That was such a sad movie! You are going to make me cry! [EMOTICON]Jeff Bailey goes yard!!!????!!! #RedSox......Who the F is Jeff Bailey? [EMOTICON]waiting for the kids to go to bed so I can get back to work... Soooo much proofing, soooo little time. [EMOTICON]@lisaschamess they don't test for FIP there -- the test isn't conclusive anyway, so it'd be sort of a waste of their time [EMOTICON]uh, slicehost is performin an unschedule maintenance! [EMOTICON]@bigMancho Jo Jó a mi nunca me contactan [EMOTICON]@erinbyrne count your blessings, right? [EMOTICON]Really blustery and wet here today [EMOTICON] . Kitten is settling in well, she no longer hisses as Puss, but follows him around curiously [EMOTICON]Last day of summer [EMOTICON]@jeremysexton Awesome! Tuesdays and weekends work bets for me. [EMOTICON]wishing the IE team would write shorter blog entries... it's like a tomb every time [EMOTICON]just finished my first &quot;oo&quot;-implementation in. at least it somehow looks like objects! [EMOTICON]leaving greenville for asheville than @pisgahforest. Was not too successful with biz. [EMOTICON]Loving this all about boyz! [EMOTICON] ( http://tinyurl.com/4gj3rr )@ekim1406 are the rules easy to learn? Can we play it one on one sometime? [EMOTICON]At the mercy of public transportaion.. [EMOTICON]RT@stevie489 mercy dugg! No Diggs at all ? [EMOTICON] http://tinyurl.com/4h3ykchttp://twitpic.com/chy6 - Max the wonderpup enjoying some skulls! [EMOTICON]@PhillyInquirer Thank you for your help, though! Much appreciated!! [EMOTICON]Staying up for the NASA launch, nothing much happening at the moment [EMOTICON]@macroe76 estaria... pro, no, no creo... si aca no puedo, mucho menos tan lejos... [EMOTICON]@Jikan Too bad you can't be at the resort with me [EMOTICON]My weekend life of looking for the perfect couch and chairs [EMOTICON]i'm [EMOTICON] my know @ejhildreth spawn that's love @ustommymc me [EMOTICON] think @daveredford nasty. now @crow_soup reallyRestoring my iPhone [EMOTICON]@flavioricardo Futsal e volei de praia [EMOTICON]@chrisWhite well I typed twit and guess it did that auto correct. [EMOTICON]On time landing at JFK... [EMOTICON]@chele I think that's a good idea...follow the people who talk to you, who are paying attention. I'm getting a little overwhelmed here. [EMOTICON]still wondering what comcast is doing here on twitter. As for me, I had a chicken burrito for lunch. and some cold-eeze, i've got a cold [EMOTICON]it's almost fall break...i can't wait to spend my time catching up on work [EMOTICON]@Mediamum Patience my fellow wine lover ... all will be revealed soon [EMOTICON]@arttemisa: naah... si se ve de lo mas sanito. [EMOTICON] Llega a dar pena botarlo...off we go to the beach [EMOTICON]@drhamr Ah ha!!!!! [EMOTICON]@ariel_fregosini &amp; @Muadib ¿Y si sacamos un avisito en el diario invitando a la gente a bloguear? [EMOTICON]@wisdoom nacistes para ser diplomatico [EMOTICON]@soymel jejeje [EMOTICON] ahorita t lo envio COMO NO CON TODO GUSTO!! jejeje@chrisWhite BwAHAHAHA what are you using SSS for? I had one hell of a time with it on my froggie [EMOTICON]@hellobethanne I should be first on that list. [EMOTICON] LOL.@etches I've already spent the lovely gift certificate. Thank you [EMOTICON]wondering when someone will end the suffering of loyal Deteoit Lions fans [EMOTICON]@champuru ahh i think i did ok. waiting game for the call back. im getting frustrated because no one else is calling yet [EMOTICON]forgot my cell phone today so I've been at work all day without it [EMOTICON] ...hmmm food smells good.something [EMOTICON]thanks for all the input on the vaporizers... aahhh so many to choose from... [EMOTICON]@javnoneim Buenas srta! Y chaau! [EMOTICON]my day? the beach...my knight? in iMax! perfect day [EMOTICON]About to take the plunge into a new macbook pro. Standing on the cliff with my toes curled on the ledge. [EMOTICON]D: nadamas checo mis rss [EMOTICON]میلاد هم که خودتون می‌دونید چه بلاهایی سرش اومده [EMOTICON] یکی به این مزیدی بگه از ما بکشه بیرون. یه طوری‌مون می‌شه ها [EMOTICON]I just had so much fun with klango yesterday. it's a very impressive program! [EMOTICON]@aerodi estoy de acuerdo pero no tienen wi-fi jajajaja [EMOTICON]@heathergardner as long as you have a place to take it to puppy school you won't loose your mind [EMOTICON]@LeeCollins that means @benmack road trip tomorrow 2 the Henry Ford Museum. Once tix r purchased will let yr Mac reboot. [EMOTICON]all packed and ready to head to LA tomorrow [EMOTICON] Yay!Kids and I are making quesadillas for dinner.... Wife is working late on this Friday night. [EMOTICON]Me voy a la cama, mañana toca avanzar el diseño este raro y jugar mucho mucho a Spore [EMOTICON]Hates dumb people and wants chocolate ice cream [EMOTICON]TDSN score so far = 12...nice! [EMOTICON] GO PATS!!!!!Happy Birthday to @Themoleskin ! Next year, can you please tell @genemccubbin to give you something smaller? like a simple thunderstorm? [EMOTICON]@RBPviolinist really? [EMOTICON] Where can I find that?Tigers lose [EMOTICON]@skycirrus nos los gastamos? [EMOTICON]@joschmoblo I'll take your advice to heart, it's great advice and I def hope to keep moving forward.. [EMOTICON]@iankennedy awesome pics man. Thanks!! I totally missed this one [EMOTICON]@cirus Ahora entiendo muchas cosas [EMOTICON]Sitting at a gas station waiting to be rescued...apparently one of my tires is broke. [EMOTICON]@crashdmx vips es buena opción, porque es desayuno y &quot;hacer tarea&quot; aunque no me terminan de convencer esos lugares [EMOTICON]@sugarrae twitter ate my homework ? [EMOTICON]Sooooo sore. Ready to leave work, but I've almost three hours left to go [EMOTICON]@puspa tahun ini giliran pulang ke Padang [EMOTICON] @budi bukan koq...just had an awesome dinner w/ hubby and my son..miss my daughter..with her dad [EMOTICON]@hmbruder i wish i was. i'm sure you'll hear the full story tonight [EMOTICON]@macsociety I buy a ton of stuff through ebay but I am also a good buyer [EMOTICON]The bible was about me. [EMOTICON]At friends house [EMOTICON] twittering from her house &lt;--- Crazy@vwduder Congrats [EMOTICON]@taiyyaba i'm torn--should i be more impressed by the sandwich or by the photography? what a talented twosome! [EMOTICON]@randymatheson HAHA! I know, my music taste is all crazy JUST LIKE THAT. [EMOTICON]@JackBastide lmao, nice [EMOTICON]@nemobion and IM jealous that youre home and Im not [EMOTICON] watch out, im coming back Fri, and then : the.party.begins. &amp;lt;33I'm going to Sydney tonight [EMOTICON]Geaux dawgs! [EMOTICON]eric is lucky. i would love 2 do that stuff [EMOTICON] u do deserve it.@nathaliemc lol, don't worry, I did it too. Remembered at about 6:45pm just too late to make it all the way from Greystones [EMOTICON]@dward Blackberry 8800. No camera. [EMOTICON] I don't like the look / feel of the Curve. There is a web of orange yarn webbed over the entire r ...@beezy I'm a stone's throw from Ft. Myer (and above Rt 50...the Arlington Mason Dixon line [EMOTICON] so don't think I'm technically from the south.Great.... i just woke up.. Can't sleep [EMOTICON] &gt;_&lt;@skyle I think the water4gas adds I got this weekend were teh criminals!! [EMOTICON] Its so spammy looking, why would anyone click?Twinkle users w/o Twitter usernames are aggravating to follow. [EMOTICON]@MaggieeRineyy I am doing pretty good, I'm glad it's the weekend too. [EMOTICON] How was your day?got a free starbucks today [EMOTICON]Driving from work to the church without getting to go home first. [EMOTICON]We have to put one of our dogs to sleep tonight! [EMOTICON] man this sucks!!!Colossus made Jen puke. Boo [EMOTICON]@haradsul JODER! xD y has visto esta otra? xD http://tinyurl.com/57yxpx muy perro el webcomic en general [EMOTICON]@EmilyPie I am jealous, I am not getting any rain at my house yet [EMOTICON]@danphilpott haha, maybe eventually [EMOTICON] Thanks for the link. This has been creating a buzz amongst my colleagues.Me voy pa la jaus, descanso un poco y en la noche le chingo [EMOTICON]@bitchmobile - Ouch [EMOTICON]@rotub not at the moment but peter has work at 11 [EMOTICON]Modest Mouse makes me feel at peace [EMOTICON]@danielerossi jeeeeesus, they are usually pretty on-top of their schedules... [EMOTICON] enjoying the cold?Happy 10th Birthday, Google! [EMOTICON]@rahafharfoush GFail [EMOTICON]Oh, and my laureate profile is on the Hugo House site. [EMOTICON] http://tinyurl.com/3ev498@helloszabi: én meg nem is olvasom/hasznalom [EMOTICON]Dow drops 777 points. Sounds like luck is on it's way [EMOTICON]back from the Xbox event in Paris, which seemed more like a Champagne drinking event, except for the @majornelson singing Take On Me part [EMOTICON]@kkffoo Oh there'll be plenty of machinima. Just not SL machinima. [EMOTICON] I just can't talk about my new gig yet...Descansando despues de 3 pruebas [EMOTICON]@carrieP - well, some get it right the first time and get the credit! [EMOTICON]@triplep220 I'm jealous. I think my CO purchase just got trumped by replacing our range... [EMOTICON]haven't turned on the lights since I got home; navigating with LCD screen light exclusively [EMOTICON]boooo how could chargers let them score at the very end. chargers lost 25-24 [EMOTICON] sooo sadis watchin Scooby Doo wit my bro [EMOTICON]My cat is twitching while she's sleeping, its scary! [EMOTICON]@ajtarachanowicz Aw...she's precious! [EMOTICON] Have fun playing!wiiii! si va a venir [EMOTICON]Faculdade na Argentina?! Aí vou eu!!!! [EMOTICON]@DjDATZ Down for some n+ now? [EMOTICON]@emilychang I'll give you a @viddler sticker if you get me a wp tattoo.. [EMOTICON]I'm getting a bonus at work [EMOTICON]@trish1972 *HUGS* Sorry [EMOTICON]@lorettaelaine: Your kitten is adorable [EMOTICON]me qede solo en casa! wiiii. [EMOTICON] estoi en el msn@falafaerie i would be one of those dirty hippies you speak of [EMOTICON]Dreading a whole new week of work [EMOTICON] working wed-sun gets depressing! never have a chance to do things during the day on weekends!100 dollar dinner for 30 bucks. Gotta love coupons and gift cards!! [EMOTICON]jojojo sabia que contraria alguien que me brindara algo siiiiii piiiiizza [EMOTICON]@tonyadam Sure, bring treats or something. They're popular. Or something. [EMOTICON]You: @ricewenchie Thx for the b-day wishes! [EMOTICON] Hope all's well w/ the house hunting! (via Twitter) http://tinyurl.com/59kfcxehhhhhhh!!! [EMOTICON] yo la estoy descargando, pero tenia un troyano jojojoGood morning the winner [EMOTICON]@jeffsoesbe No -- I'm just the writer. [EMOTICON] Full-length play, getting a staged reading at Foothill in September.Ping Ping (the runt of the litter) didn't make it, poor little guy [EMOTICON]@audiomarketing thanks for the 20 min alert Lisa - just enough time to go to toilet, stock provisions and login [EMOTICON]@mattc58 trust Angela is ok with that . . . [EMOTICON]$925 for two color letterpress on invite, RSVP, and save the date with two plain envelopes. Deal or no deal? I was hoping less [EMOTICON]@ianivs I'm just dumb today I guess. It's Twitter and it's a tweet...ugh. I'll get it right eventually [EMOTICON]@Die_Heldin Ja, okay, kann ich verstehen... ich bleib angezogen und erspar dir den Anblick. [EMOTICON]@fedee juajajaj te dió resultado? a mi no [EMOTICON]I'm missing all my friends from Disney and wishing there was some way we could all go back again. [EMOTICON]Ok so i was late to work corporate was there i got hot Salsa in my eye had to stay later and then i got home and my baby rat died [EMOTICON]i need a break. [EMOTICON]@tialessa it can be a little addicting, especially when you find old friends. [EMOTICON]http://tinyurl.com/6k6w6g // oldu olucak tüm müftülere cami görünümmlü ev yapt?rs?nlar [EMOTICON]ahora puodre hacer 2 post cada semana y subirlas a la pagina de mi empresa [EMOTICON] ... podre poner links hacia mi pagina personal..?? no creo [EMOTICON]First date with CuteFilmNerd was a month ago tonight. Unfortunately, schedules preclude us from getting together, unless it's very late. [EMOTICON]@NatFace aw thanks hun! are we going to do mauritian food soon? or maybe just a coffee and a cheeky ciggie [EMOTICON]diggs please? http://poprl.com/2ql thank you! [EMOTICON]@dougsymington Not.Helping. [EMOTICON]@dragon_harrower let him type something for us oneday [EMOTICON]@toolbear no actually not important, only a password to my nexon account [EMOTICON]i knew i wouldn't like having to call students. [EMOTICON]@PRland merci beaucoup, du coup c'est @h2_barbie, ma personal shopper que je dois remercier pour son aide [EMOTICON]@belgort phigment says a real man isn't afraid to own a kitty [EMOTICON]@marathonchris I should be in FL from Dec 21st through Jan 2nd. I wish I could come earlier [EMOTICON] but we are trapping winter ducks then. [EMOTICON]@Karlil32 time to ask for a bigger raise! [EMOTICON]otia! La nueva versión de GriS permite compartir feeds con GReader 8sólo falta que deje poner note [EMOTICON] )Ahora si, al sobre [EMOTICON]Pas de wifi ouvert [EMOTICON] tant pis bonne nuit tout le monde !!@MelissaPR God, I am ready for a glass of wine! Have fun Melissa [EMOTICON]@katowulf Thanks, Wulfie! I blame you for getting me on twitter though and adding to my distractions. [EMOTICON] O [EMOTICON] -------------------------------------------------------------------------------- /yaml2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | $doc = %{ 3 | yaml2tsv 4 | 5 | Takes a YAML document stream -- that is, a concatenation of YAML top-level 6 | objects -- and treats them as key/value records to be turned into 7 | tsv-with-header. 8 | } 9 | 10 | require 'yaml' 11 | require 'pp' 12 | 13 | if STDIN.tty? 14 | STDERR.puts $doc.strip 15 | exit 1 16 | end 17 | 18 | all = [] 19 | YAML.load_documents(STDIN) do |ydoc| 20 | all << ydoc 21 | end 22 | 23 | cols = all.map{|x| x.keys}.flatten.uniq.sort 24 | puts cols.map{|c| c.gsub(/\s/," ")}.join("\t") 25 | all.each do |ydoc| 26 | puts cols.map{|c| (ydoc[c] || "").to_s.gsub(/\s/," ")}.join("\t") 27 | end 28 | 29 | 30 | # cols = nil 31 | # YAML.load_documents(STDIN) do |ydoc| 32 | # if cols.nil? 33 | # cols = ydoc.keys.sort 34 | # puts cols.map{|c| c.gsub(/\s/," ")}.join("\t") 35 | # end 36 | # puts cols.map{|c| ydoc[c].gsub(/\s/," ")}.join("\t") 37 | # end 38 | --------------------------------------------------------------------------------
%s" % part) 25 | print 26 | 27 | 28 | sortable = '-s' in sys.argv 29 | 30 | if sortable: 31 | print header 32 | 33 | print "" 34 | if sortable: 35 | print "" 36 | line = sys.stdin.readline() 37 | parts = line[:-1].split("\t") 38 | sys.stdout.write("") 39 | for part in parts: sys.stdout.write("" 41 | print "" 42 | 43 | print_rows() 44 | 45 | if sortable: print "" 46 | 47 | print "
%s" % part) 40 | print "
" 48 | -------------------------------------------------------------------------------- /tsv2json: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | Convert TSV (with header) into a stream of newline-delimited JSON objects. 4 | 5 | EXAMPLE: pretty print 6 | cat events.2015.20170206133646.tab | tsv2json | jq . 7 | """ 8 | 9 | import sys 10 | import json as jsonmod 11 | try: 12 | exec "import ujson as jsonmod" 13 | except ImportError: 14 | pass 15 | 16 | warning_count = 0 17 | warning_max = 20 18 | def warning(s): 19 | global warning_count 20 | warning_count += 1 21 | if warning_count > warning_max: return 22 | print>>sys.stderr, "WARNING: %s" % s 23 | 24 | headerline = sys.stdin.readline() 25 | colnames = headerline.rstrip("\n").split("\t") 26 | 27 | for line_num,line in enumerate(sys.stdin): 28 | parts = line.rstrip("\n").split("\t") 29 | if len(parts) != len(colnames): 30 | warning("Mismatched %d columns in line %d, but %s in header" % (len(parts), line_num+2, len(colnames))) 31 | n = min(len(parts),len(colnames)) 32 | dct = dict(zip(colnames[:n], parts[:n])) 33 | else: 34 | dct = dict(zip(colnames,parts)) 35 | print jsonmod.dumps(dct) 36 | 37 | -------------------------------------------------------------------------------- /tsv2my: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | USAGES 4 | tsv2my mydb.temptable < data.tsv 5 | xlsx2tsv data.xlsx | python loadtsv.py mydb.temptable 6 | Loads TSV-with-header data into a new mysql table. 7 | All columns are varchar's. 8 | Uses strict TSV - no quoting or comments, and no tabs or newlines in values. 9 | """ 10 | import sys,os,re 11 | from collections import defaultdict 12 | 13 | if len(sys.argv) == 1: 14 | print "need DBNAME.TABLENAME argument" 15 | sys.exit(1) 16 | db_table_spec = sys.argv[1] 17 | assert '.' in db_table_spec 18 | db_name,table_name = db_table_spec.split('.') 19 | 20 | if len(sys.argv)>2: 21 | colspec = sys.argv[2] 22 | else: 23 | colspec = None 24 | 25 | def uniq_c(seq): 26 | ret = defaultdict(lambda:0) 27 | for x in seq: 28 | ret[x] += 1 29 | return dict(ret) 30 | 31 | input = sys.stdin 32 | header = input.readline() 33 | columns = [re.sub('[,:; -]','_',h.strip()) for h in header[:-1].split("\t")] 34 | dups = set(col for col,count in uniq_c(columns).items() if count>1) 35 | #print dups 36 | if dups: 37 | dup_counts = defaultdict(lambda:0) 38 | for i,col in enumerate(columns): 39 | if col in dups: 40 | dup_counts[col] += 1 41 | columns[i] = "%s%d" % (col, dup_counts[col]) 42 | #print columns 43 | #print len(columns) 44 | assert len(set(columns)) == len(columns) 45 | 46 | import MySQLdb 47 | conn = MySQLdb.connect(user='root', db=db_name) 48 | curs = conn.cursor() 49 | 50 | curs.execute("drop table if exists `%s`" % table_name) 51 | 52 | if colspec: 53 | col_types = colspec.split(",") 54 | else: 55 | col_types = ['text'] * len(columns) 56 | 57 | max_size = 2000 58 | sql = "create table `%s` (" % table_name 59 | # sql += ",".join( "`%s` varchar(%d)" % (c,max_size) for c in columns ) 60 | sql += ",".join( "`%s` %s" % (columns[j], col_types[j]) for j in range(len(columns))) 61 | sql += ")" 62 | curs.execute(sql) 63 | 64 | 65 | insert_sql = "insert into %s values (%s)" % (table_name, ",".join(["%s"] * len(columns))) 66 | #print insert_sql 67 | for line in input: 68 | values = line[:-1].split("\t") 69 | #print values 70 | #print len(values) 71 | # if any(len(v)>max_size for v in values): 72 | # print "Warning, value truncated" 73 | curs.execute(insert_sql, values) 74 | 75 | -------------------------------------------------------------------------------- /tsv2ssv: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | exec perl -pe 's/\t/ /g' 4 | -------------------------------------------------------------------------------- /tsv2tex: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # Outputs to a basic TeX table format. 3 | 4 | # puts "\\hline" 5 | for line in STDIN 6 | puts line.chomp.gsub("_","\\_").gsub("\t"," & ") + " \\\\" 7 | end 8 | # puts "\\hline" 9 | -------------------------------------------------------------------------------- /tsv2yaml: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | $doc = %{ 3 | yaml2tsv 4 | 5 | Takes TSV-with-header and outputs as stream of YAML documents. 6 | This is a decent way to get key-value pretty printing; 7 | e.g. useful for if there are many columns. 8 | } 9 | 10 | require 'yaml' 11 | require 'pp' 12 | 13 | if STDIN.tty? 14 | STDERR.puts $doc.strip 15 | exit 1 16 | end 17 | 18 | columns = STDIN.readline.chomp.split("\t") 19 | STDIN.each do |line| 20 | parts = line.chomp.split("\t") 21 | h = {} 22 | (0...parts.size).each{|i| h[columns[i]] = parts[i]} 23 | puts h.to_yaml 24 | end 25 | -------------------------------------------------------------------------------- /tsvawk: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | Wrapper around tabawk, letting you use column names instead of positions. It 4 | makes column names from the header into awk global variables that are integers 5 | for positions, so you can do things like 6 | 7 | tsvawk '{print $id,$name}' 8 | tsvawk '$count >= 5' 9 | 10 | Your awk script will *not* see the header line from the file; this script absorbs it. 11 | 12 | -r: repeat the header on output too. (Only good for "print $0" sorts of scripts.) 13 | """ 14 | 15 | import sys,os 16 | if sys.stdin.isatty(): 17 | print>>sys.stderr, __doc__.strip() 18 | sys.exit(1) 19 | sys.stdin = open('/dev/stdin','U',buffering=0) 20 | sys.stdout = open('/dev/stdout','w',buffering=0) 21 | header = sys.stdin.readline() 22 | colnames = header[:-1].split("\t") 23 | flags = [] 24 | for i,colname in enumerate(colnames): 25 | colname = colname.strip() 26 | if not colname: continue 27 | flags += ["-v", "%s=%s" % (colname, i+1)] 28 | 29 | if '-r' in sys.argv: 30 | print header[:-1] 31 | sys.argv.pop(sys.argv.index('-r')) 32 | #print flags 33 | args = ["tabawk"] + flags + sys.argv[1:] 34 | os.execvp( "tabawk", args ) 35 | -------------------------------------------------------------------------------- /tsvcat: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | tsvcat [files] 4 | 5 | Concatenates TSV-with-header files, aligning columns with same name. 6 | Can rename columns and match columns across files with different names. 7 | """ 8 | 9 | import sys,itertools 10 | import tsvutil 11 | tsvutil.fix_stdio() 12 | #import codecs; sys.stdout = codecs.open('/dev/stdout','w',encoding='utf8',buffering=0) 13 | 14 | def flatten(iter): 15 | return list(itertools.chain(*iter)) 16 | def stable_uniq(x): 17 | s = set(); y = [] 18 | for i in x: 19 | if i in s: continue 20 | s.add(i) 21 | y.append(i) 22 | return y 23 | def tsv_reader(f): 24 | return csv.DictReader(f, dialect=None,delimiter="\t",quoting=csv.QUOTE_NONE) 25 | 26 | items = sys.argv[1:] 27 | alias_specs = [s for s in items if '=' in s] 28 | drop_specs = [s for s in items if s.startswith('-')] 29 | filenames = [s for s in items if s not in alias_specs and s not in drop_specs] 30 | files = [open(f,'U') for f in filenames] 31 | if not filenames: 32 | files = [sys.stdin] 33 | file_cols = [f.readline()[:-1].split("\t") for f in files] 34 | all_cols = stable_uniq(flatten(file_cols)) 35 | 36 | aliases = {} 37 | for alias_spec in alias_specs: 38 | left,right = alias_spec.split('=') 39 | assert left != right 40 | assert left and right 41 | assert left in all_cols 42 | aliases[right] = left 43 | if right not in all_cols: 44 | all_cols[ all_cols.index(left) ] = right 45 | else: 46 | all_cols.remove(left) 47 | 48 | for drop_spec in drop_specs: 49 | col = drop_spec[1:] 50 | #print col 51 | #print all_cols 52 | assert col in all_cols 53 | all_cols.remove(col) 54 | 55 | print "\t".join(all_cols) 56 | 57 | for i,f in enumerate(files): 58 | cols = file_cols[i] 59 | for line in f: 60 | #line = unicode(line,'utf8') 61 | parts = line[:-1].split("\t") 62 | hash = {} 63 | for j in range(len(cols)): 64 | hash[cols[j]] = parts[j] 65 | out = [] 66 | for col in all_cols: 67 | if col in hash: 68 | out.append(hash[col]) 69 | elif col in aliases: 70 | out.append(hash[aliases[col]]) 71 | else: 72 | out.append('') 73 | print u"\t".join(out) 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /tsvsort: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Like tabsort, but preserve first row as header. 3 | exec hwrap tabsort "$@" 4 | -------------------------------------------------------------------------------- /tsvutil.py: -------------------------------------------------------------------------------- 1 | """Miscellaneous utilities to support some of the tsvutils scripts""" 2 | 3 | import sys,csv,codecs 4 | 5 | warning_count = 0 6 | warning_max = 20 7 | def warning(s): 8 | global warning_count 9 | warning_count += 1 10 | if warning_count > warning_max: return 11 | print>>sys.stderr, "WARNING: %s" % s 12 | 13 | def cell_text_clean(text): 14 | s = text 15 | # um i can't remember what subclasses which 16 | if isinstance(s,str) and not isinstance(s,unicode): 17 | s = unicode(s, 'utf8', 'replace') 18 | if "\t" in s: warning("Clobbering embedded tab") 19 | if "\n" in s: warning("Clobbering embedded newline") 20 | if "\r" in s: warning("Clobbering embedded carriage return") 21 | s = s.replace("\t"," ").replace("\n"," ").replace("\r"," ") 22 | s = s.encode('utf-8') 23 | return s 24 | 25 | def fix_stdio(): 26 | sys.stdout = IOWrapper(sys.stdout) 27 | 28 | class IOWrapper: 29 | # I like to press Ctrl-C; why is Python yelling at me? 30 | def __init__(self, fp): 31 | self.fp = fp 32 | def write(self,*a,**k): 33 | try: 34 | self.fp.write(*a,**k) 35 | except IOError, e: 36 | if e.errno == 32: # broken pipe 37 | sys.exit(0) 38 | raise e 39 | 40 | ################### 41 | # http://docs.python.org/library/csv.html 42 | 43 | 44 | import csv, codecs, cStringIO 45 | 46 | class UTF8Recoder: 47 | """ 48 | Iterator that reads an encoded stream and reencodes the input to UTF-8 49 | """ 50 | def __init__(self, f, encoding): 51 | self.reader = codecs.getreader(encoding)(f) 52 | 53 | def __iter__(self): 54 | return self 55 | 56 | def next(self): 57 | #s = self.reader.next() 58 | #return s.encode('utf-8','replace') 59 | return self.reader.next().encode("utf-8") 60 | 61 | class UnicodeReader: 62 | """ 63 | A CSV reader which will iterate over lines in the CSV file "f", 64 | which is encoded in the given encoding. 65 | """ 66 | 67 | def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 68 | f = UTF8Recoder(f, encoding) 69 | self.reader = csv.reader(f, dialect=dialect, **kwds) 70 | 71 | def next(self): 72 | row = self.reader.next() 73 | return [unicode(s, "utf-8") for s in row] 74 | 75 | def __iter__(self): 76 | return self 77 | 78 | class UnicodeWriter: 79 | """ 80 | A CSV writer which will write rows to CSV file "f", 81 | which is encoded in the given encoding. 82 | """ 83 | 84 | def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 85 | # Redirect output to a queue 86 | self.queue = cStringIO.StringIO() 87 | self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 88 | self.stream = f 89 | self.encoder = codecs.getincrementalencoder(encoding)() 90 | 91 | def writerow(self, row): 92 | self.writer.writerow([s.encode("utf-8") for s in row]) 93 | # Fetch UTF-8 output from the queue ... 94 | data = self.queue.getvalue() 95 | data = data.decode("utf-8") 96 | # ... and reencode it into the target encoding 97 | data = self.encoder.encode(data) 98 | # write to the target stream 99 | self.stream.write(data) 100 | # empty queue 101 | self.queue.truncate(0) 102 | 103 | def writerows(self, rows): 104 | for row in rows: 105 | self.writerow(row) 106 | 107 | -------------------------------------------------------------------------------- /uniq2tsv: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # USAGE: 3 | # ... | uniq -c | uniq2tsv 4 | perl -ne 'print "$1\t$2\n" if /^ *(\d+) (.*)/ or die "doesnt look like uniq -c format: $_"' -------------------------------------------------------------------------------- /xls2csvfiles: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | # http://stackoverflow.com/questions/9884353/xls-to-csv-convertor 3 | import xlrd 4 | import csv 5 | from os import sys 6 | 7 | def csv_from_excel(excel_file): 8 | workbook = xlrd.open_workbook(excel_file) 9 | all_worksheets = workbook.sheet_names() 10 | for worksheet_name in all_worksheets: 11 | worksheet = workbook.sheet_by_name(worksheet_name) 12 | your_csv_file = open(''.join([worksheet_name,'.csv']), 'wb') 13 | wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) 14 | 15 | for rownum in xrange(worksheet.nrows): 16 | wr.writerow([unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)]) 17 | your_csv_file.close() 18 | 19 | if __name__ == "__main__": 20 | csv_from_excel(sys.argv[1]) 21 | 22 | -------------------------------------------------------------------------------- /xls2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | # adapted from http://stackoverflow.com/questions/9884353/xls-to-csv-convertor 3 | import xlrd 4 | # import csv 5 | import sys 6 | 7 | warning_count=0 8 | warning_max = 20 9 | def warning(s): 10 | global warning_count 11 | warning_count += 1 12 | if warning_count > warning_max: return 13 | print>>sys.stderr, "WARNING: %s" % s 14 | 15 | def cell_text_clean(text): 16 | s = text 17 | if "\t" in s: warning("Clobbering embedded tab") 18 | if "\n" in s: warning("Clobbering embedded newline") 19 | if "\r" in s: warning("Clobbering embedded carriage return") 20 | s = s.replace("\t"," ").replace("\n"," ").replace("\r"," ") 21 | return s 22 | 23 | def tsv_from_excel(excel_file, sheetnum): 24 | workbook = xlrd.open_workbook(excel_file) 25 | all_worksheets = workbook.sheet_names() 26 | worksheet_name = all_worksheets[ sheetnum-1 ] 27 | worksheet = workbook.sheet_by_name(worksheet_name) 28 | # wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) 29 | 30 | for rownum in xrange(worksheet.nrows): 31 | row = [unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)] 32 | row = [cell_text_clean(x) for x in row] 33 | print '\t'.join(row) 34 | 35 | def usage(): 36 | print>>sys.stderr, """ 37 | USAGE: 38 | xls2tsv filename.xls [sheetnum] 39 | sheetnum >= 1, defaults to 1 40 | """.strip() 41 | sys.exit(1) 42 | 43 | def main(args): 44 | if len(args)<2: usage() 45 | if len(args)>4: usage() 46 | excel_file = args[1] 47 | sheet_num = int(args[2]) if len(args)>2 else 1 48 | if sheet_num < 1: 49 | assert False, "need sheet number to be >= 1" 50 | tsv_from_excel(excel_file, sheet_num) 51 | 52 | if __name__ == "__main__": 53 | main(sys.argv) 54 | 55 | -------------------------------------------------------------------------------- /xlsx2tsv: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2.7 2 | """ 3 | xlsx2tsv filename.xlsx [sheet number or name] 4 | 5 | Parse a .xlsx (Excel OOXML, which is not OpenOffice) into tab-separated values. 6 | If it has multiple sheets, need to give a sheet number or name. 7 | Outputs honest-to-goodness tsv, no quoting or embedded \\n\\r\\t. 8 | 9 | One reason I wrote this is because Mac Excel 2008 export to csv or tsv messes 10 | up encodings, converting everything to something that's not utf8 (macroman 11 | perhaps). This script seems to do better. 12 | 13 | The spec for this format is 5220 pages. I did not use it. This was helpful: 14 | http://blogs.msdn.com/excel/archive/2008/08/14/reading-excel-files-from-linux.aspx 15 | But mostly I guessed how the format works. So bugs are guaranteed. 16 | 17 | To read from a pipe in python, ironically it takes a few tricks to disable the 18 | csv module's complicated excel-compatible default rules: 19 | csv.DictReader(os.popen("xlsx2tsv filename.xlsx"), dialect=None, delimiter='\\t', quoting=csv.QUOTE_NONE) 20 | 21 | brendan o'connor - anyall.org 22 | originally at gist.github.com/22764 23 | but new home is github.com/brendano/tsvutils 24 | """ 25 | 26 | #from __future__ import print_function 27 | import xml.etree.ElementTree as ET 28 | import os,sys,zipfile,re,itertools 29 | 30 | def myjoin(seq, sep=" "): 31 | " because str.join() is annoying " 32 | return sep.join(str(x) for x in seq) 33 | 34 | args = sys.argv[:] 35 | args.pop(0) 36 | if args: 37 | z = zipfile.ZipFile(args.pop(0)) 38 | elif not sys.stdin.isatty(): 39 | z = zipfile.ZipFile(sys.stdin) 40 | else: 41 | print>>sys.stderr, __doc__.strip() 42 | sys.exit(1) 43 | 44 | n=lambda x: "{http://schemas.openxmlformats.org/spreadsheetml/2006/main}%s" % x 45 | 46 | sheet_filenames = [f for f in z.namelist() if re.search("^xl/worksheets/sheet.*xml$", f)] 47 | workbook_x = ET.XML(z.read("xl/workbook.xml")) 48 | sheet_xs = workbook_x.find(n("sheets")).findall(n("sheet")) 49 | 50 | def sheet_report(): 51 | global sheet_xs 52 | print>>sys.stderr, "Sheets in this file:" 53 | for i,x in enumerate(sheet_xs): 54 | print>>sys.stderr, "%3d: %s" % (i+1, x.get('name')) 55 | sys.exit(1) 56 | 57 | def sheet_error(msg): 58 | print>>sys.stderr, msg 59 | sheet_report() 60 | 61 | if not args and len(sheet_filenames) > 1: 62 | sheet_error("There are multiple sheets -- need to specify a sheet number or name.") 63 | elif not args and len(sheet_filenames) == 1: 64 | sheet_num = 1 65 | elif args: 66 | sheet_num = args.pop(0) 67 | 68 | if isinstance(sheet_num,str) and (not re.search('^[0-9]+$',sheet_num) or int(sheet_num) > len(sheet_filenames)): 69 | name = sheet_num 70 | inds = [i for i,x in enumerate(sheet_xs) if x.get('name')==name] 71 | if not inds: sheet_error("Can't find sheet with name '%s'" % name) 72 | if len(inds)>1: sheet_error("Multiple sheets with name '%s'" % name) 73 | sheet_num = inds[0] + 1 74 | 75 | 76 | def letter2col_index(letter): 77 | """ A -> 0, B -> 1, Z -> 25, AA -> 26, BA -> 52 """ 78 | base26digits = [1+ord(x)-ord("A") for x in letter] 79 | return sum([x*26**(len(base26digits) - k - 1) for k,x in enumerate(base26digits)]) - 1 80 | 81 | def flatten(iter): 82 | return list(itertools.chain(*iter)) 83 | 84 | def cell2text(cell): 85 | if cell is None: 86 | return "" 87 | elif 't' in cell.attrib and cell.attrib['t'] == 's': 88 | # shared string 89 | idx = int(cell.find(n("v")).text) 90 | si = ss_list[idx] 91 | t_elt = si.find(n("t")) 92 | if t_elt is not None: 93 | return t_elt.text or "" 94 | t_elts = si.findall(n("r") + "/" + n("t")) 95 | if t_elts: 96 | text = "".join( (t.text) for t in t_elts ) 97 | return text 98 | raise Exception("COULDNT DECODE CELL: %s" % ET.tostring(si)) 99 | #return si.find(n("t")).text 100 | #return ET.tostring(si) 101 | else: 102 | v_elt = cell.find(n("v")) 103 | if v_elt is None: return "" 104 | return v_elt.text 105 | 106 | 107 | ss_xml = z.read("xl/sharedStrings.xml") 108 | ss_list = ET.XML(ss_xml).findall(n("si")) 109 | 110 | xml = z.read("xl/worksheets/sheet%s.xml" % sheet_num) 111 | s = ET.fromstring(xml) 112 | rows = s.findall(n("sheetData")+"/"+n("row")) 113 | 114 | all_cells = flatten( [[c for c in row.findall(n("c"))] for row in rows] ) 115 | max_col = max(letter2col_index(re.search("^[A-Z]+",c.attrib['r']).group()) for c in all_cells) 116 | 117 | def make_cells(): 118 | return [None] * (max_col+1) 119 | 120 | warning_count=0 121 | warning_max = 20 122 | def warning(s): 123 | global warning_count 124 | warning_count += 1 125 | if warning_count > warning_max: return 126 | print>>sys.stderr, "WARNING: %s" % s 127 | 128 | def cell_text_clean(text): 129 | s = text.encode("utf8") 130 | if "\t" in s: warning("Clobbering embedded tab") 131 | if "\n" in s: warning("Clobbering embedded newline") 132 | if "\r" in s: warning("Clobbering embedded carriage return") 133 | s = s.replace("\t"," ").replace("\n"," ").replace("\r"," ") 134 | return s 135 | 136 | for row in rows: 137 | cells_elts = row.findall(n("c")) 138 | inds = [] # parallel 139 | for c in cells_elts: 140 | letter = re.search("^[A-Z]+", c.attrib['r']).group() 141 | inds.append(letter2col_index(letter) ) 142 | cells = make_cells() 143 | for c,j in zip(cells_elts,inds): 144 | cells[j] = c 145 | #print( *(cell2text( c ).encode("utf-8").replace("\t"," ") for c in cells), sep="\t") 146 | print myjoin((cell_text_clean(cell2text( c )) for c in cells), sep="\t") 147 | 148 | if warning_count > warning_max: 149 | print>>sys.stderr, "%d total warnings, %d hidden" % (warning_count, warning_count-warning_max) 150 | -------------------------------------------------------------------------------- /xlsx_test/ragged.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brendano/tsvutils/a286c8179342285803871834bb92c39cd52e516d/xlsx_test/ragged.xlsx -------------------------------------------------------------------------------- /xlsx_test/s.xml: -------------------------------------------------------------------------------- 1 | 2 |