Reading data from a custom log in azure log analytics - azure

I have linked the following log itno azure log anlytic environment via customer log
2023-01-24 07:58:30[X:MoveCarddataShare_Start]
2023-01-24 07:58:30[X;MoveCarddataShare_FileTomove:SA\Dispatch\)
2023-01-24 07:58:30[X;MoveCarddataShare_FileCountTomove:2)
2023-01-24 07:58:32[X;MoveCarddataShare_FileTomove:Styled and Co\Dispatch\)
2023-01-24 07:58:32[X;MoveCarddataShare_FileCountTomove:2)
I want to now the value of X (which is the client) and then the action and then the result
THe following code works
let temp =
ShelSA_cardMovment_CL
| parse RawData with * "[" C
| parse RawData with * ";" A
| parse RawData with * "^" R
| extend dt = substring(RawData,0,19)
,Client = split(C,";",0)
,Action = split(A,"^",0)
,Re = R;
temp
|extend Result= replace_string(tostring(Re),')','')
But all resulting columns have "[ ]" around the output the replace will remove it but it seems ungainly
["ShellSA"]
["MoveCarddataShare_FileTomove"]
Symon\Dispatch\)
Also, I wondered if this is the best way
This is the CV output I want
Datetime of action
Client
Action
Re
Result
24/01/2023 07:58
"[""X:MoveCarddataShare^Start\r\n""]"
"[""""]"
"Start"
"Start"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_FileTomove""]"
"SA\Dispatch)"
"SA\Dispatch"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_FileCountTomove""]"
"2)"
"2"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_FileTomove""]"
"Styled and Co\Dispatch)"
"Styled and Co\Dispatch"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_FileCountTomove""]"
"2)"
"2"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_FileTomove""]"
"Symon\Dispatch)"
"Symon\Dispatch"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_FileCountTomove""]"
"3)"
"3"
2023-01-23 14:51:25
"[""X:MoveCarddataShare_DateofFilemove\r\n""]"
"[""""]"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_LastfileMoved""]"
"New Text Document.txt)"
"New Text Document.txt"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare_Movefiledcount""]"
"14)"
"14"
24/01/2023 07:58
"[""X""]"
"[""MoveCarddataShare""]"
"End"
"End"

I'm guessing this is what you are looking for
datatable(RawData:string)
[
#"2023-01-24 07:58:30[X:MoveCarddataShare_Start]"
,#"2023-01-24 07:58:30[X;MoveCarddataShare_FileTomove:SA\Dispatch\)"
,#"2023-01-24 07:58:30[X;MoveCarddataShare_FileCountTomove:2)"
,#"2023-01-24 07:58:32[X;MoveCarddataShare_FileTomove:Styled and Co\Dispatch\)"
,#"2023-01-24 07:58:32[X;MoveCarddataShare_FileCountTomove:2)"
]
| parse kind=regex flags=U RawData with Timestamp:datetime #"\[" Client "[;:]" Action #"[]:]" Result #"\)?$"
RawData
Timestamp
Client
Action
Result
2023-01-24 07:58:30[X:MoveCarddataShare_Start]
2023-01-24T07:58:30Z
X
MoveCarddataShare_Start
2023-01-24 07:58:30[X;MoveCarddataShare_FileTomove:SA\Dispatch)
2023-01-24T07:58:30Z
X
MoveCarddataShare_FileTomove
SA\Dispatch\
2023-01-24 07:58:30[X;MoveCarddataShare_FileCountTomove:2)
2023-01-24T07:58:30Z
X
MoveCarddataShare_FileCountTomove
2
2023-01-24 07:58:32[X;MoveCarddataShare_FileTomove:Styled and Co\Dispatch)
2023-01-24T07:58:32Z
X
MoveCarddataShare_FileTomove
Styled and Co\Dispatch\
2023-01-24 07:58:32[X;MoveCarddataShare_FileCountTomove:2)
2023-01-24T07:58:32Z
X
MoveCarddataShare_FileCountTomove
2
Fiddle

Related

Let the user create a custom format using a string

I'd like a user to be able to create a custom format in QtWidgets.QPlainTextEdit() and it would format the string and split out the results in another QtWidgets.QPlainTextEdit().
For example:
movie = {
"Title":"The Shawshank Redemption",
"Year":"1994",
"Rated":"R",
"Released":"14 Oct 1994",
"Runtime":"142 min",
"Genre":"Drama",
"Director":"Frank Darabont",
"Writer":"Stephen King (short story \"Rita Hayworth and Shawshank Redemption\"),Frank Darabont (screenplay)",
"Actors":"Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler",
"Plot":"Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.",
"Language":"English",
"Country":"USA",
"Awards":"Nominated for 7 Oscars. Another 21 wins & 36 nominations.",
"Poster":"https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU#._V1_SX300.jpg",
"Ratings": [
{
"Source":"Internet Movie Database",
"Value":"9.3/10"
},
{
"Source":"Rotten Tomatoes",
"Value":"91%"
},
{
"Source":"Metacritic",
"Value":"80/100"
}
],
"Metascore":"80",
"imdbRating":"9.3",
"imdbVotes":"2,367,380",
"imdbID":"tt0111161",
"Type":"movie",
"DVD":"15 Aug 2008",
"BoxOffice":"$28,699,976",
"Production":"Columbia Pictures, Castle Rock Entertainment",
"Website":"N/A"
}
custom_format = '[ {Title} | ⌚ {Runtime} | ⭐ {Genre} | 📅 {Released} | {Rated} ]'.format(Title=movie['Title'], Runtime=movie['Runtime'], Genre=movie['Genre'],Released=movie['Released'],Rated=movie['Rated'])
print(custom_format)
This code above, would easily print [ The Shawshank Redemption | ⌚ 142 min | ⭐ Drama | 📅 14 Oct 1994 | R ].
However, if I change this code from:
custom_format = '[ {Title} | ⌚ {Runtime} | ⭐ {Genre} | 📅 {Released} | {Rated} ]'.format(Title=movie['Title'], Runtime=movie['Runtime'], Genre=movie['Genre'],Released=movie['Released'],Rated=movie['Rated'])
To:
custom_format = "'[ {Title} | ⌚ {Runtime} | ⭐ {Genre} | 📅 {Released} | {Rated} ]'.format(Title=movie['Title'], Runtime=movie['Runtime'], Genre=movie['Genre'],Released=movie['Released'],Rated=movie['Rated'])"
Notice, that the whole thing is wrapped in "". Therefor its a string. Now doing this will not print out the format that I want.
The reason I wrapped it in "" is because when I add my original custom_format into a QtWidgets.QPlainTextEdit(), it converts it into a string it wont format later on.
So my original idea was, the user creates a custom format for themselves in a QtWidgets.QPlainTextEdit(). Then I copy that format, open a new window wher the movie json variable is contained and paste the format into another QtWidgets.QPlainTextEdit() where it would hopefuly show it formatted correctly.
Any help on this would be appreciated.
ADDITIONAL INFORMATION:
User creates their format inside QtWidgets.QPlainTextEdit().
Then the user clicks Test Format which should display [ The Shawshank Redemption | ⌚ 142 min | ⭐ Drama | 📅 14 Oct 1994 | R ] but instead it displays
Trying to use the full format command would require an eval(), which is normally considered not only bad practice, but also a serious security issue, especially when the input argument is completely set by the user.
Since the fields are known, I see little point in providing the whole format line, and it is better to parse the format string looking for keywords, then use keyword lookup to create the output.
class Formatter(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QVBoxLayout(self)
self.formatBase = QtWidgets.QPlainTextEdit(
'[ {Title} | ⌚ {Runtime} | ⭐ {Genre} | 📅 {Released} | {Rated} ]')
self.formatOutput = QtWidgets.QPlainTextEdit()
layout.addWidget(self.formatBase)
layout.addWidget(self.formatOutput)
self.formatBase.textChanged.connect(self.processFormat)
self.processFormat()
def processFormat(self):
format_str = self.formatBase.toPlainText()
# escape double braces
clean = re.sub('{{', '', re.sub('}}', '', format_str))
# capture keyword arguments
tokens = re.split(r'\{(.*?)\}', clean)
keywords = tokens[1::2]
try:
# build the dictionary with given arguments, unrecognized keywords
# are just printed back in the {key} form, in order let the
# user know that the key wasn't valid;
values = {k:movie.get(k, '{{{}}}'.format(k)) for k in keywords}
self.formatOutput.setPlainText(format_str.format(**values))
except (ValueError, KeyError):
# exception for unmatching braces
pass

Printing different image for different list data

so i made a list and i used tkinter for choosing a random data in list and showing that in a showinfo box. now i was just wondering if its possible to make a random image for random data.
for eg i am making a app that generates a random anime name from the list but i want to add the anime picture also is there any way i can do that ?
i haven't tried building it but here is what i have made so far.
i have no error i just want to have different picture for different names from the list chose randomly
import random
from tkinter import*
from tkinter import messagebox
anime = [
"1 Ore ga Ojousama Gakkou ni ' Shomin Sample' Toshite Gets♥Sareta Ken",
"2 Ookami to Koushinryou II",
"3 Ookami to Koushinryou",
"4 Grisaia no Kajitsu",
"5 Nyanko Days",
"6 Suzumiya Haruhi no Shoushitsu",
"7 Ookami Kodomo no Ame to Yuki",
"8 Sankarea",
"9 Boku no Hero Academia the Movie 2: Heroes Rising",
"10 Tensei shitara Slime Datta Ken OVA",
"11 Nakitai Watashi wa Neko wo Kaburu ",
"12 Tensei shitara Slime Datta Ken",
"13 Nande Koko ni Sensei ga!?",
"14 Kotonoha no Niwa",
"15 Chuunibyou demo Koi ga Shitai! Movie: Take On Me",
"16 Byousoku 5 Centimeter",
"17 Summer Wars",
"18 Tenki no Ko ",
"19 Kimi no Na wa.",
"20 Sword Art Online: Alicization – War of Underworld",
"21 Hinamatsuri",
"22 Gakuen Babysitters ",
"23 Yahari Ore no Seishun Love Comedy wa Machigatteiru. Zoku",
"24 Yahari Ore no Seishun Love Comedy wa Machigatteiru.",
"25 Hataraku Maou-sama!",
"26 Shokugeki no Souma: Shin no Sara",
"27 Shokugeki no Souma: San no Sara – Toutsuki Ressha-hen",
"28 Sewayaki Kitsune no Senko-san",
"29 Shokugeki no Souma: San no Sara",
"30 Shokugeki no Souma: Ni no Sara",
"31 Shokugeki no Soma ",
"32 Ao no Exorcist ",
"33 Ao no Exorcist: Kyoto Fujouou-hen",
"34 Boku dake ga Inai Machi",
"35 Kono Subarashii Sekai ni Shukufuku wo!: Kurenai Densetsu",
"36 Hyouka",
"37 Kami no Tou",
"38 Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e",
"39 Shingeki no Kyojin Season 3",
"40 Kaguya-sama wa Kokurasetai?: Tensai-tachi no Renai Zunousen 2nd Season",
"41 Shingeki no Kyojin Season 3 Part 2",
"42 Shingeki no Kyojin Season 2",
"43 Shingeki no Kyojin ",
"44 Kono Subarashii Sekai ni Shukufuku wo! 2",
"45 Seishun Buta Yarou wa Yumemiru Shoujo no Yume wo Minai",
"46 Kono Subarashii Sekai ni Shukufuku wo!",
"47 Seishun Buta Yarou wa Bunny Girl Senpai no Yume wo Minai",
"48 Sakurasou no Pet na Kanojo",
"49 Tate no Yuusha no Nariagari",
"50 IS: Infinite Stratos",
"51 Kawaikereba Hentai demo Suki ni Natte Kuremasu ka?",
"52 Enen no Shouboutai",
"53 Kaguya-sama wa Kokurasetai: Tensai-tachi no Renai Zunousen",
"54 Chuunibyou demo Koi ga Shitai! Ren",
"55 Koe no Katachi ",
"56 Dr. Stone",
"57 One Punch Man",
"58 Naruto Shippuden",
"59 Sword Art Online II",
"60 Sword Art Online",
"61 Ansatsu Kyoushitsu 2nd season",
"62 Ansatsu Kyoushitsu",
"63 Chuunibyou demo Koi ga Shitai!",
"64 Kimetsu no Yaiba",
"65 Re:Zero kara Hajimeru Isekai Seikatsu",
"66 Nanatsu no Taizai",
"67 Steins;Gate 0",
"68 Steins;Gate",
"69 Nanatsu no Taizai: Imashime no Fukkatsu",
"70 Tokyo Ghoul √A",
"71 One Punch Man Season 2",
"72 Hunter x Hunter (2011)",
"73 Darling in the FranXX",
"74 Tokyo Ghoul",
"75 Boku no Hero Academia 3rd Season.",
"76 Boku no Hero Academia",
"77 Nanatsu no Taizai: Kamigami no Gekirin",
"78 Naruto",
"79 Boku no Hero Academia 4th Season",
"80 Arte",
"81 Yakusoku no Neverland",
"82 Aho Girl",
"83 Wotaku ni Koi wa Muzukashii",
"84 Kimi no Suizou wo Tabetai ",
"85 Sakasama no Patema",
"86 Grisaia no Rakuen",
"87 Kimi ni Todoke",
"88 Kimi ni Todoke 2nd Season",
"89 Sukitte Ii na yo.",
"90 Ore wo Suki nano wa Omae dake ka yo",
"91 Koi To Uso",
"92 Saijaku Muhai no Bahamut",
"93 7 seeds",
"94 7 Seeds 2nd Season",
"95 Kono Yo no Hate de Koi wo Utau Shoujo YU-NO",
"96 Gotoubun no Hanayome",
"97 Masamune-kun no Revenge",
"98 Tokyo Magnitude 8.0",
"99 Keppeki Danshi! Aoyama-kun Episode ",
"100 Ao Haru Ride",
"101 Kakegurui",
"102 Kakegurui××",
"103 Tokyo Ghoul:re",
"104 Tokyo Ghoul:re 2nd season",
"105 Toradora!",
"106 Sounan Desu ka?",
"107 Denpa Onna to Seishun Otoko",
"108 Zenonzard The Animation",
"109 Hanamaru Kindergarden",
"110 Tonari no Kaibutsu-kun",
"111 Domestic na Kanojo",
"112 Haikyuu!!",
"113 Haikyuu!! Second Season",
"114 Haikyuu!!: Karasuno Koukou vs. Shiratorizawa Gakuen Koukou",
"115 Haikyuu!!: To the Top",
"116 Sword Art Online: Alicization – War of Underworld 2nd Season",
"117 Haikyuu!!: To the Top",
"118 Yahari Ore no Seishun Love Comedy wa Machigatteiru. Kan",
"119 Kanojo, Okarishimasu",
"120 Shokugeki no Souma: Gou no Sara",
"121 Maou Gakuin no Futekigousha: Shijou Saikyou no Maou no Shiso, Tensei shite Shison-tachi no Gakkou e",
"122 UZAKI-CHAN WA ASOBITAI!",
"123 ReLIFE",
"124 ReLIFE: Kanketsu-hen",
"125 The God of High School",
"126 Inou-Battle wa Nichijou-kei no Naka de",
"127 Kyoukai no Kanata",
"128 Arifureta Shokugyou de Sekai Saikyou",
"129 ISEKAI MAOU TO SHOUKAN SHOUJO NO DOREI MAJUTSU",
"130 AKAME GA KILL!",
"131 Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season",
"132 Shinchou Yuusha: Kono Yuusha ga Ore Tueee Kuse ni Shinchou Sugiru",
"133 Noragami",
"134 Noragami OVA",
"135 Noragami Aragoto",
"136 Nisekoi",
"137 Nisekoi:",
"138 Black Bullet",
"139 Devils Line",
"140 TABOO TATTOO",
"141 Hajimete no Gal ",
"142 Kuzu no Honkai",
"143 Tsurezure Children",
"144 Himouto! Umaru-chan",
"145 Boku no Kanojo ga Majimesugiru Sho-bitch na Ken",
"146 Bungou Stray Dogs",
"147 Bungou Stray Dogs Season 2",
"148 Bungou Stray Dogs 3rd Season",
"149 Lovely★Complex",
"150 Plunderer",
"151 TONIKAKU KAWAII",
"152 Enen no Shouboutai: Ni no Shou",
"153 Haikyuu!!: To the Top 2nd Season",
"154 Shigatsu wa Kimi no Uso",
"155 Kaichou wa Maid-sama",
"156 Karakai Jouzu no Takagi-san",
"157 Karakai Jouzu no Takagi-san 2"]
top = Tk()
top.geometry("200x100")
def fun():
messagebox.showinfo("Anime", random.choice(anime))
can = Canvas(top, height = 100, width = 100)
can.place(relx=0.5, rely=0.5, anchor=CENTER)
b1 = Button(can,text = "Generate",command = fun,activeforeground = "black",activebackground = "yellow",pady=10)
b1.pack(side = TOP)
top.mainloop()
Since you want the image to be corresponding to the anime titles I suggest you use a dictionary instead of a list. Also, use Toplevel widget to display the output.
So here is an example code:
import random
from tkinter import*
from PIL import Image, ImageTk
absolute_path = r'C:\Users\ ' # your absolute path goes here(Note: Don't remove the extra space in the end)
anime = {
"1 Ore ga Ojousama Gakkou ni ' Shomin Sample' Toshite Gets♥Sareta Ken": 'Akira.png', # anime image name
"2 Ookami to Koushinryou II": 'Alex.jpg', # anime image name
}
root = Tk()
root.geometry("200x100")
def fun():
top = Toplevel(root)
top.title('Anime')
random_choice = random.choice(list(anime.keys())) #choosing random from dictionary keys
label = Label(top, text=random_choice)
label.pack()
top.img = ImageTk.PhotoImage(Image.open(absolute_path.strip()+anime[random_choice]))
image_label = Label(top, image=top.img)
image_label.pack()
can = Canvas(root, height = 100, width = 100)
can.place(relx=0.5, rely=0.5, anchor=CENTER)
b1 = Button(can,text = "Generate",command = fun,activeforeground = "black",activebackground = "yellow",pady=10)
b1.pack(side = TOP)
root.mainloop()

Why is white space not found in my NodeJS program?

For some obscure reason, my str.split(" ") command doesn't seem to work. I've been trying to debug the situation for a while now and can't seem to find the solution. Let me start off by saying that, unfortunately, I can't replicate the error. I've tried creating a JSFiddle, but it works correctly.
Here's my problem: I've got a JSObject "library" over which I'm looping to create MongoDocuments and during this "construction" I get the following:
if (payload[i].asking) {
let price = payload[i].asking
price = price.substring(1, price.length);
console.log(price);
console.log(price.indexOf(" "));
const priceArr = price.split(" ");
console.log(priceArr);
price = priceArr[0];
currency = priceArr[1];
listing.set('asking', price);
listing.set('currency', currency);
}
where:
payload is the full JSObject "library"
[i] the current JSObject
and asking, the key I'm working on, in this particular place of the code.
And here's the result:
500.00 eur
-1
[ '500.00 eur' ]
950.00 eur
-1
[ '950.00 eur' ]
5,000.00 usd
-1
[ '5,000.00 usd' ]
250.00 usd
-1
[ '250.00 usd' ]
800.00 usd
-1
[ '800.00 usd' ]
899.00 usd
-1
[ '899.00 usd' ]
3,500.00 usd
-1
[ '3,500.00 usd' ]
2,800.00 usd
-1
[ '2,800.00 usd' ]
2,250.00 usd
-1
[ '2,250.00 usd' ]
3,750.00 usd
-1
[ '3,750.00 usd' ]
1,500.00 usd
-1
[ '1,500.00 usd' ]
5,800.00 usd
-1
[ '5,800.00 usd' ]
2,500.00 usd
-1
[ '2,500.00 usd' ]
So I understand why price.split(" ") doesn't work: I apparently have no white space in the first place (indexOf(" ") === -1) but I'm not sure why and what's happening. payload[i].asking is a string alright (price.substring proves it) but I don't understand why this white space doesn't exist.
OK so I found an alternative, using regex, even though it doesn't solve the exact problem I describe per se:
const priceArr = price.split(/(\s+)/)
It might help someone else...

Get the strings before the comma with R

I am a beginner with R. Now, I have a vector in a data.frame like this
city
Kirkland,
Bethesda,
Wellington,
La Jolla,
Berkeley,
Costa, Evie KW172NJ
Miami,
Plano,
Sacramento,
Middletown,
Webster,
Houston,
Denver,
Kirkland,
Pinecrest,
Tarzana,
Boulder,
Westfield,
Fair Haven,
Royal Palm Beach, Fl
Westport,
Encino,
Oak Ridge,
I want to clean it. What I want is all the city names before the comma. How can I get the result in R? Thanks!
You can use gsub with a bit of regexp :
cities <- gsub("^(.*?),.*", "\\1", df$city)
This one works, too :
cities <- gsub(",.*$", "", df$city)
Just for fun, you can use strsplit
> x <- c("London, UK", "Paris, France", "New York, USA")
> sapply(strsplit(x, ","), "[", 1)
[1] "London" "Paris" "New York"
You could use regexpr to find the position of the first comma in each element and use substr to snip them at this:
x <- c("London, UK", "Paris, France", "New York, USA")
substr(x,1,regexpr(",",x)-1)
[1] "London" "Paris" "New York"
This works as well:
x <- c("London, UK", "Paris, France", "New York, USA")
library(qdap)
beg2char(x, ",")
## > beg2char(x, ",")
## [1] "London" "Paris" "New York"
If the this was a column in a dataframe, we can use tidyverse.
library(dplyr)
x <- c("London, UK", "Paris, France", "New York, USA")
x <- as.data.frame(x)
x %>% separate(x, c("A","B"), sep = ',')
A B
1 London UK
2 Paris France
3 New York USA

R convert all rows to strings

I need to convert all rows of a dataframe to strings.
Here's a sample data:
1.12331,4.331123,4.12335435,1,"asd"
1.123453345,5.654456,4.889999,1.45456,"qwe"
2.00098,5.5445,4.768799,1.999999,"ttre"
I read this data into R, got a dataframe.
td<-read.table("test.csv", sep=',')
When I run apply(td, 2, as.character) on this data, I got
V1 V2 V3 V4 V5
[1,] "1.1233" "4.3311" "4.1234" "1.0000" "asd"
[2,] "1.1235" "5.6545" "4.8900" "1.4546" "qwe"
[3,] "2.0010" "5.5445" "4.7688" "2.0000" "ttre"
But when I do the same only on numeric columns, I got the different result:
apply(td[,1:4], 2, as.character)
V1 V2 V3 V4
[1,] "1.12331" "4.331123" "4.12335435" "1"
[2,] "1.123453345" "5.654456" "4.889999" "1.45456"
[3,] "2.00098" "5.5445" "4.768799" "1.999999"
As a result I need a dataframe with values exactly the same as in source file. What I'm doing wrong?
You can set colClasses in read.table() to make all columns as character.
td <- read.table("test.csv", sep=',',colClasses="character")
td
V1 V2 V3 V4 V5
1 1.12331 4.331123 4.12335435 1 asd
2 1.123453345 5.654456 4.889999 1.45456 qwe
3 2.00098 5.5445 4.768799 1.999999 ttre
str(td)
'data.frame': 3 obs. of 5 variables:
$ V1: chr "1.12331" "1.123453345" "2.00098"
$ V2: chr "4.331123" "5.654456" "5.5445"
$ V3: chr "4.12335435" "4.889999" "4.768799"
$ V4: chr "1" "1.45456" "1.999999"
$ V5: chr "asd" "qwe" "ttre"
The best way to do this is the read the data in as character in the first place. You can do this with the colClasses argument to read.table:
td <- read.table("test.csv", sep=',', colClasses="character")

Resources