Funções puras, seleção/filtragem, importação de dados e um pouco sobre strings

Funções puras - para usar quando a função existe somente para uma operação específica

Function[x,x^2] (* primeiro parâmetro é a variável muda, que é transformada de acordo com o segundo *)

%[a+b]

agora, com runas

#^2& (* #, ou #1, é o parâmetro, de modo que ele já está no lugar do operamdo - o & é fundamental para avisar o programa que essa é uma função pura *)

%[c+d]

Seleção de valores de uma lista

teste=RandomVariate[ NormalDistribution[10,4],1000];

Select[teste,#<0&]

menorQueZero[x_]:=x<0

Select[teste,menorQueZero]

Length[ Select[teste,2<#<6&] ]

Length[teste]

Uma digressão - como construir um histograma sem plotar

BinCounts[teste,{-6,16,2}]

BinCounts[teste,{{0,2,6,10,20}}]

Lendo um arquivo do disco e lidando com os dados

NotebookDirectory[]

FileNameJoin[ {NotebookDirectory[] ,"muge.dat"}]

file=Import[ FileNameJoin[ {NotebookDirectory[] ,"muge.dat"}] ] (* arquivos .dat são lidos como tabela, automaticamente; se a extensão for outra, é preciso usar a opção "Table" *)

uma maneira simolista de separar os números neste caso é usar  índices absolutos

Most[ file[[7;;]] ]

usando lacunas para separar os campos numéricos

um _ identifica uma lacuna que, seguido de Real, significa “qualquer numero real” (podia ser _Integer, _Complex, _Rational,_String)

padrao={_Real,_Real,_Real,_Real,_Real,_Real,_Real,_Real} (*significa qualquer lista de 8 numeros reais *)

dados=Cases[file,padrao];

TableForm[dados]

Lendo texto

texto=Import[ FileNameJoin[ {NotebookDirectory[] ,"muge.dat"}] ,"Text"]

Strings

Extraindo um número de detnro do texto lido como tabela

Uma possibilidade é ficar com  atabela e extrair com o conhecimento detalhado das posições e propriedades... sujeito a enganos de contagem e dá errado com qualquer variação no texto, por pequena que seja

file[[1,9]]

StringDrop[ file[[1,9]],2]

2 %

NumericQ[ StringDrop[ file[[1,9]],2] ]

isto transformará o string em número, finalmente. ToExpression[string] interpreta o parametro da mesma forma que o processador de entrada de um notebook

ToExpression[ StringDrop[ file[[1,9]],2] ]

NumericQ[%]

Melhor localizar as sequencias de caracteres que cercam o valor que se deseja extrair

operador concatenação ~~

nome="Ivan"

nomeCompleto=nome~~" Jose"

nomeCompleto

isto não funciona

StringCases[texto,"Z="~~atomo__~~"\n"]

StringCases[texto,"Z="~~atomo__~~"PHOTON"]

StringCases[texto,"Z="~~atomo__~~"PHOTON" :>ToExpression[atomo]]

Assim como := é a atribuição retardada (só avalia o valor no momento da execução), :> é a regra retardada - só determina o valor no momento de aplicação da regra

22 %[[1]]

z=StringCases[texto,"Z="~~atomo__~~"PHOTON" :>ToExpression[atomo]] [[1]]

{x,x,x}/.x->RandomReal[]

{x,x,x}/.x:>RandomReal[]

para comparar strings

s1="Ola"

StringMatchQ[s1,"Alo"]

StringMatchQ[s1,"Olala"]

StringMatchQ[s1,"Ola"]

StringMatchQ[s1,"ola"]

StringMatchQ[s1,"ola",IgnoreCase->True]

um último exemplo

unidades=StringCases[texto,"("~~z__~~")"]

unit=TextCases[unidades,"Word"] (* este parece só funcionar na versao 10.4 *)

para extrair as unidades em qualquer versao (gentilmente encontrado pelo Tiago)

unit=StringCases[texto,Shortest["("~~xx__~~")"]:>xx] (* veja que dispensou a primeira etapa de escolher a linha que tinha as unidades *)

a=10

ToString[a]

StringJoin["X=",ToString[a],"%"]