How to convert text to JSON in JavaScript - formatter
My dataset looks like the below:
Make: AUSTIN
Models:
1000
1300
Make: Ferrari
Models:
458
La Ferrari
I will like this in a JSON format, as below:
{
make: "AUSTIN",
models: [
{model: "1000"},
{model: "1300"}
]
},
{
make: "Ferrari",
models: [
{model: "458"},
{model: "La Ferrari"}
]
}
It's a very large dataset so I can't do it manually.
Looked around online and didn't find anything suitable.
Thanks in advance!
As far as I understand your question, I would like to answer it.
You can do something like this.
function getFormatted(s){
const total = []
const lines = s.split('\n');
let index = 0;
while(lines[index]){
const make = lines[index];
const obj = {
make: make.replace('Make: ',''),
models: []
}
// index + 1 will be 'Models:'
let modelCurrentIndex = index + 2;
let currentModel = lines[modelCurrentIndex];
// Check until the next occurrence of 'Make: '
while(currentModel && !currentModel.startsWith("Make:")){
obj.models.push({model: currentModel});
modelCurrentIndex += 1;
currentModel = lines[modelCurrentIndex];
}
index = modelCurrentIndex;
total.push(obj);
}
return JSON.stringify(total);
}
Sample Web Page would be like this
After calling this function,
Explanation:
The First Index of the lines should be identified as 'make' and that index + 2 will be identified as the starting point of Models.
The while loop will add the models to the array in the object until it identifies the line that starts with 'Make:'. After that, the index is moved and the process gets repeated.
Make sure you are entering the values with a line break!
Related
Fine-tune a pre-trained model
I am new to transformer based models. I am trying to fine-tune the following model (https://huggingface.co/Chramer/remote-sensing-distilbert-cased) on my dataset. The code: enter image description here and I got the following error: enter image description here I will be thankful if anyone could help. The preprocessing steps I followed: input_ids_t = [] attention_masks_t = [] for sent in df_train['text_a']: encoded_dict = tokenizer.encode_plus( sent, add_special_tokens = True, max_length = 128, pad_to_max_length = True, return_attention_mask = True, return_tensors = 'tf', ) input_ids_t.append(encoded_dict['input_ids']) attention_masks_t.append(encoded_dict['attention_mask']) # Convert the lists into tensors. input_ids_t = tf.concat(input_ids_t, axis=0) attention_masks_t = tf.concat(attention_masks_t, axis=0) labels_t = np.asarray(df_train['label']) and i did the same for testing data. Then: train_data = tf.data.Dataset.from_tensor_slices((input_ids_t,attention_masks_t,labels_t)) and the same for testing data
It sounds like you are feeding the transformer_model 1 input instead of 3. Try removing the square brackets around transformer_model([input_ids, input_mask, segment_ids])[0] so that it reads transformer_model(input_ids, input_mask, segment_ids)[0]. That way, the function will have 3 arguments and not just 1.
Editing the get_string function in Game Maker Studio 2
Everything works yet when I get prompted up to enter my name it looks like an error. Is there anyway I can edit it? I am new to GameMaker, this is just my personal work for fun. I have been looking online for a solution but it does not seem to be anywhere, I not sure if it's possible. The following is the code that I am referring to. if (currentHealth <= 0) { name = get_string("Please enter your name: ","Anonymus"); highscore_add(name, global.points); room_goto(GAMEOVER); }
Maybe try "get_string_async()" get_string should only be used for debugging. if you use get_string_async() your code will look like this Create Event: async = -1 input = 0 Step Event: if (currentHealth <= 0 && input == 0) { name = get_string_async("Please enter your name: ","Anonymus"); input = 1 } Async_Dialogue Event: var i_d = ds_map_find_value(async_load, "id"); if i_d == async { if ds_map_find_value(async_load, "status") { name = ds_map_find_value(async_load, "result"); highscore_add(name, global.points); room_goto(GAMEOVER); } This works fine for me
If you want an "input field" (term to look for), you can use keyboard_string. For example, Create: keyboard_string = ""; Step: if (keyboard_check_pressed(vk_enter)) { input = keyboard_string; // ... do something with `input` } Draw: draw_text(x, y, keyboard_string); Or a slightly less basic example that I made in 2013.
Multi-level counter iteration
I'm stuck on creating an algorithm as follows. I know this shouldn't be too difficult, but I simply can't get my head around it, and can't find the right description of this kind of pattern. Basically I need a multi-level counter, where when a combination exist in the database, the next value is tried by incrementing from the right. 1 1 1 - Start position. Does this exist in database? YES -> Extract this and go to next 1 1 2 - Does this exist in database? YES -> Extract this and go to next 1 1 3 - Does this exist in database? YES -> Extract this and go to next 1 1 4 - Does this exist in database? NO -> Reset level 1, move to level 2 1 2 1 - Does this exist in database? YES -> Extract this and go to next 1 2 2 - Does this exist in database? NO -> Reset level 2 and 1, move to level 3 2 1 1 - Does this exist in database? YES -> Extract this and go to next 2 1 2 - Does this exist in database? YES -> Extract this and go to next 2 1 3 - Does this exist in database? NO -> Reset level 1 and increment level 2 2 2 1 - Does this exist in database? YES -> Extract this and go to next 2 2 2 - Does this exist in database? YES -> Extract this and go to next 2 2 3 - Does this exist in database? YES -> Extract this and go to next 2 3 1 - Does this exist in database? NO -> Extract this and go to next 3 1 1 - Does this exist in database? NO -> Extract this and go to next 3 2 1 - Does this exist in database? NO -> End, as all increments tried There could be more than three levels, though. In practice, each value like 1, 2, etc is actually a $value1, $value2, etc. containing a runtime string being matched against an XML document. So it's not just a case of pulling out every combination already existing in the database.
Assuming, the length of the DB key is known upfront, here's one way how it can be implemented. I'm using TypeScript but similar code can be written in your favorite language. First, I declare some type definitions for convenience. export type Digits = number[]; export type DbRecord = number; Then I initialize fakeDb object which works as a mock data source. The function I wrote will work against this object. This object's keys are representing the the database records' keys (of type string). The values are simple numbers (intentionally sequential); they represent the database records themselves. export const fakeDb: { [ dbRecordKey: string ]: DbRecord } = { '111': 1, '112': 2, '113': 3, '211': 4, '212': 5, '221': 6, '311': 7, }; Next, you can see the fun part, which is the function that uses counterDigits array of "digits" to increment depending on whether the record presence or absence. Please, do NOT think this is the production-ready code! A) there are unnecessary console.log() invocations which only exist for demo purposes. B) it's a good idea to not read a whole lot of DbRecords from the database into memory, but rather use yield/return or some kind of buffer or stream. export function readDbRecordsViaCounter(): DbRecord[] { const foundDbRecords: DbRecord[] = []; const counterDigits: Digits = [1, 1, 1]; let currentDigitIndex = counterDigits.length - 1; do { console.log(`-------`); if (recordExistsFor(counterDigits)) { foundDbRecords.push(extract(counterDigits)); currentDigitIndex = counterDigits.length - 1; counterDigits[currentDigitIndex] += 1; } else { currentDigitIndex--; for (let priorDigitIndex = currentDigitIndex + 1; priorDigitIndex < counterDigits.length; priorDigitIndex++) { counterDigits[priorDigitIndex] = 1; } if (currentDigitIndex < 0) { console.log(`------- (no more records expected -- ran out of counter's range)`); return foundDbRecords; } counterDigits[currentDigitIndex] += 1; } console.log(`next key to try: ${ getKey(counterDigits) }`); } while (true); } The remainings are some "helper" functions for constructing a string key from a digits array, and accessing the fake database. export function recordExistsFor(digits: Digits): boolean { const keyToSearch = getKey(digits); const result = Object.getOwnPropertyNames(fakeDb).some(key => key === keyToSearch); console.log(`key=${ keyToSearch } => recordExists=${ result }`); return result; } export function extract(digits: Digits): DbRecord { const keyToSearch = getKey(digits); const result = fakeDb[keyToSearch]; console.log(`key=${ keyToSearch } => extractedValue=${ result }`); return result; } export function getKey(digits: Digits): string { return digits.join(''); } Now, if you run the function like this: const dbRecords = readDbRecordsViaCounter(); console.log(`\n\nDb Record List: ${ dbRecords }`); you should see the following output that tells you about the iteration steps; as well as reports the final result in the very end. ------- key=111 => recordExists=true key=111 => extractedValue=1 next key to try: 112 ------- key=112 => recordExists=true key=112 => extractedValue=2 next key to try: 113 ------- key=113 => recordExists=true key=113 => extractedValue=3 next key to try: 114 ------- key=114 => recordExists=false next key to try: 121 ------- key=121 => recordExists=false next key to try: 211 ------- key=211 => recordExists=true key=211 => extractedValue=4 next key to try: 212 ------- key=212 => recordExists=true key=212 => extractedValue=5 next key to try: 213 ------- key=213 => recordExists=false next key to try: 221 ------- key=221 => recordExists=true key=221 => extractedValue=6 next key to try: 222 ------- key=222 => recordExists=false next key to try: 231 ------- key=231 => recordExists=false next key to try: 311 ------- key=311 => recordExists=true key=311 => extractedValue=7 next key to try: 312 ------- key=312 => recordExists=false next key to try: 321 ------- key=321 => recordExists=false next key to try: 411 ------- key=411 => recordExists=false ------- (no more records expected -- ran out of counter's range) Db Record List: 1,2,3,4,5,6,7 It is strongly recommended to read the code. If you want me to describe the approach or any specific detail(s) -- let me know. Hope, it helps.
Join tiles in Corona SDK into one word for a Breakout game grid?
I have a game project to re-implement Breakout. I want to display two words, each word on a line. They are joined by the bricks block. Inside, the top line is the first name, aligned left. The bottom line is the last name, aligned right. They are input from textboxes, and rendered as shown: Each second that passes, the screen will add a configurable number of bricks to the grid (for example, five bricks per second) until the two words appear complete. I displayed a letter of the alphabet which is created from the matrix(0,1). ...But I don’t know how to join them into one word. How can I join these letters? This is what I've gotten so far: Bricks.lua local Bricks = display.newGroup() -- static object local Events = require("Events") local Levels = require("Levels") local sound = require("Sound") local physics = require("physics") local Sprites = require("Sprites") local Func = require("Func") local brickSpriteData = { { name = "brick", frames = {Sprites.brick} }, { name = "brick2", frames = {Sprites.brick2} }, { name = "brick3", frames = {Sprites.brick3} }, } -- animation table local brickAnimations = {} Sprites:CreateAnimationTable { spriteData = brickSpriteData, animationTable = brickAnimations } -- get size from temp object for later use local tempBrick = display.newImage('red_apple_20.png',300,500) --local tempBrick = display.newImage('cheryGreen2.png',300,500) local brickSize = { width = tempBrick.width, height = tempBrick.height } --tempBrick:removeSelf( ) ---------------- -- Rubble -- needs to be moved to its own file ---------------- local rubbleSpriteData = { { name = "rubble1", frames = {Sprites.rubble1} }, { name = "rubble2", frames = {Sprites.rubble2} }, { name = "rubble3", frames = {Sprites.rubble3} }, { name = "rubble4", frames = {Sprites.rubble4} }, { name = "rubble5", frames = {Sprites.rubble5} }, } local rubbleAnimations = {} Sprites:CreateAnimationTable { spriteData = rubbleSpriteData, animationTable = rubbleAnimations } local totalBricksBroken = 0 -- used to track when level is complete local totalBricksAtStart = 0 -- contains all brick objects local bricks = {} local function CreateBrick(data) -- random brick sprite local obj = display.newImage('red_apple_20.png') local objGreen = display.newImage('cheryGreen2.png') obj.name = "brick" obj.x = data.x --or display.contentCenterX obj.y = data.y --or 1000 obj.brickType = data.brickType or 1 obj.index = data.index function obj:Break() totalBricksBroken = totalBricksBroken + 1 bricks[self.index] = nil obj:removeSelf( ) sound.play(sound.breakBrick) end function obj:Update() if(self == nil) then return end if(self.y > display.contentHeight - 20) then obj:Break() end end if(obj.brickType ==1) then physics.addBody( obj, "static", {friction=0.5, bounce=0.5 } ) elseif(obj.brickType == 2) then physics.addBody( objGreen,"static",{friction=0.2, bounce=0.5, density = 1 } ) end return obj end local currentLevel = testLevel -- create level from bricks defined in an object -- this allows for levels to be designed local function CreateBricksFromTable(level) totalBricksAtStart = 0 local activeBricksCount = 0 for yi=1, #level.bricks do for xi=1, #level.bricks[yi] do -- create brick? if(level.bricks[yi][xi] > 0) then local xPos local yPos if(level.align == "center") then --1100-((99*16)*0.5) xPos = display.contentCenterX- ((level.columns * brickSize.width) * 0.5/3) + ((xi-1) * level.xSpace)--display.contentCenterX --xPos = 300 +(xi * level.xSpace) yPos = 100 + (yi * level.ySpace)--100 else xPos = level.xStart + (xi * level.xSpace) yPos = level.yStart + (yi * level.ySpace) end local brickData = { x = xPos, y = yPos, brickType = level.bricks[yi][xi], index = activeBricksCount+1 } bricks[activeBricksCount+1] = CreateBrick(brickData) activeBricksCount = activeBricksCount + 1 end end end totalBricks = activeBricksCount totalBricksAtStart = activeBricksCount end -- create bricks for level --> set from above functions, change function to change brick build type local CreateAllBricks = CreateBricksFromTable -- called by a timer so I can pass arguments to CreateAllBricks local function CreateAllBricksTimerCall() CreateAllBricks(Levels.currentLevel) end -- remove all brick objects from memory local function ClearBricks() for i=1, #bricks do bricks[i] = nil end end -- stuff run on enterFrame event function Bricks:Update() -- update individual bricks if(totalBricksAtStart > 0) then for i=1, totalBricksAtStart do -- brick exists? if(bricks[i]) then bricks[i]:Update() end end end -- is level over? if(totalBricksBroken == totalBricks) then Events.allBricksBroken:Dispatch() end end ---------------- -- Events ---------------- function Bricks:allBricksBroken(event) -- cleanup bricks ClearBricks() local t = timer.performWithDelay( 1000, CreateAllBricksTimerCall) --CreateAllBricks() totalBricksBroken = 0 -- play happy sound for player to enjoy sound.play(sound.win) print("You Win!") end Events.allBricksBroken:AddObject(Bricks) CreateAllBricks(Levels.currentLevel) return Bricks Levels.lua local Events = require("Events") local Levels = {} local function MakeLevel(data) local level = {} level.xStart = data.xStart or 100 level.yStart = data.yStart or 100 level.xSpace = data.xSpace or 23 level.ySpace = data.ySpace or 23 level.align = data.align or "center" level.columns = data.columns or #data.bricks[1] level.bricks = data.bricks --> required return level end Levels.test4 = MakeLevel { bricks = { {0,2,0,0,2,0,0,2,0}, {0,0,2,0,2,0,2,0,0}, {0,0,0,0,2,0,0,0,0}, {1,1,2,1,1,1,2,1,1}, {0,0,0,0,1,0,0,0,0}, {0,0,0,0,1,0,0,0,0}, {0,0,0,0,1,0,0,0,0}, } } Levels.test5 = MakeLevel { bricks = { {0,0,0,1,0,0,0,0}, {0,0,1,0,1,0,0,0}, {0,0,1,0,1,0,0,0}, {0,1,0,0,0,1,0,0}, {0,1,1,1,1,1,0,0}, {1,0,0,0,0,0,1,0}, {1,0,0,0,0,0,1,0}, {1,0,0,0,0,0,1,0}, {1,0,0,0,0,0,1,0} } } -- Levels.test6 = MakeLevel2 -- { -- bricks = -- { ----A "a" = {{0,0,0,1,0,0,0,0}, -- {0,0,1,0,1,0,0,0}, -- {0,0,1,0,1,0,0,0}, -- {0,1,0,0,0,1,0,0}, -- {0,1,1,1,1,1,0,0}, -- {1,0,0,0,0,0,1,0}, -- {1,0,0,0,0,0,1,0}, -- {1,0,0,0,0,0,1,0}, -- {1,0,0,0,0,0,1,0}}, ----B -- "b" = {{1,1,1,1,0,0,0}, -- {1,0,0,0,1,0,0}, -- {1,0,0,0,1,0,0}, -- {1,0,0,0,1,0,0}, -- {1,1,1,1,0,0,0}, -- {1,0,0,0,1,0,0}, -- {1,0,0,0,0,1,0}, -- {1,0,0,0,0,1,0}, -- {1,1,1,1,1,0,0}}, --........... --....... --... -- --Z -- "z"= {{1,1,1,1,1,1,1,0}, -- {0,0,0,0,0,1,0,0}, -- {0,0,0,0,1,0,0,0}, -- {0,0,0,0,1,0,0,0}, -- {0,0,0,1,0,0,0,0}, -- {0,0,1,0,0,0,0,0}, -- {0,0,1,0,0,0,0,0}, -- {0,1,0,0,0,0,0,0}, -- {1,1,1,1,1,1,1,0}} -- } -- } -- stores all levels in ordered table so that one can be selected randomly by index Levels.levels = { --Levels.test4, Levels.test5 -- Levels.test6, } function Levels:GetRandomLevel() return self.levels[math.random(#Levels.levels)] end Levels.notPlayedYet = {} Levels.currentLevel = Levels:GetRandomLevel() -- Events function Levels:allBricksBroken(event) self.currentLevel = Levels:GetRandomLevel() end Events.allBricksBroken:AddObject(Levels) return Levels The work I've done thus far (same as above) as an external download: http://www.mediafire.com/download/1t89ftkbznkn184/Breakout2.rar
In the interest of actually answering the question: I'm not 100% sure what you mean by "How can I join these letters", but from poking through the code I have a guess, so please clarify on whether it is accurate, or if I am wrong about what you wanted. Scenario 1 You haven't successfully achieved the image illustrated in the screenshot - you've been able to draw one letter, but not multiple ones. In this case, you'll need to have a better understanding of what your code is doing. The CreateBricksFromTable function takes in a Level object, which is created by the MakeLevel function from a table with a bricks property, which is a table of tables that represent rows with columns in them, showing what type of brick should be at each position. In your commented-out level, you have created an table where the bricks field contains a field for each letter, but the MakeLevel function still expects a bricks field that directly contains the grid of blocks. You will have to - as it seems you attempted - create a MakeWordLevel function (or the like) that takes this letter list, and a word for each line, and constructs a larger grid by copying the appropriate letters into it. StackOverflow is not your programming tutor, and an SO question is not the right forum for having people write code for you or getting into step-by-step details of how to do this, but I'll leave you a basic outline. Your function would look something like this: local function MakeWordLevel(data, line1, line2) local level = {} ... return level end And then would have to: Populate all of the same properties that MakeLevel does Calculate how wide (level.columns) the level should be with all the letters Create a table in the same format as the bricks properties, but big enough to hold all of the letters Go through the input strings (line1 and line2), find the correct letter data from what is now the test6 array, and copy that data into the large table Assign that table as level.bricks This question already is a bit outside of what StackOverflow is intended for in that it asks about how to implement a feature rather than achieve a small, specific programming task, so any further followup should take place in a chatroom - perhaps the Hello World room would be helpful. Scenario 2: This was my original guess, but after considering and reading past edits, I doubt this is answering the right question You may want a solid "background" of, say, red blocks, surrounding your letters and making the field into a solid "wall", with the name in a different color. And you may want these bricks to slowly show up a few at a time. In that case, the main thing you need to do is keep track of what spaces are "taken" by the name bricks. There are many ways to do this, but I would start with a matrix to keep track of that - as big as the final playing field - full of 0's. Then, as you add the bricks for the name, set a 1 at the x,y location in that matrix according to that block's coordinate. When you want to fill in the background, each time you go to add a block at a coordinate, check that "taken" matrix before trying to add a block - if it's taken (1), then just skip it and move onto the next coordinate. This works if you're filling in the background blocks sequentially (say, left to right, top to bottom), or if you want to add them randomly. With random, you'd also want to keep updating the "taken" matrix so you don't try to add a block twice. The random fill-in, however, presents its own problem - it will keep taking longer to fill in as it goes, because it'll find more and more "taken" blocks and have to pick a new one. There are solutions to this, of course, but I won't go too far down that road when I don't know if that's even what you want.
I don't really understand (or read, for that matter) your code but from what I see joining them into complete words is easy. You have two possibilities. You can "render" them directly into your level/display data, simply copy them to the appropriate places, like this: -- The level data. local level = {} -- Create the level data. for row = 1, 25, 1 do local rowData = {} for column = 1, 80, 1 do rowData[column] = "." end level[row] = rowData end -- Now let us setup the letters. local letters = { A = { {".",".",".","#",".",".",".","."}, {".",".","#",".","#",".",".","."}, {".",".","#",".","#",".",".","."}, {".","#",".",".",".","#",".","."}, {".","#","#","#","#","#",".","."}, {"#",".",".",".",".",".","#","."}, {"#",".",".",".",".",".","#","."}, {"#",".",".",".",".",".","#","."}, {"#",".",".",".",".",".","#","."} }, B = { {"#","#","#","#",".",".","."}, {"#",".",".",".","#",".","."}, {"#",".",".",".","#",".","."}, {"#",".",".",".","#",".","."}, {"#","#","#","#",".",".","."}, {"#",".",".",".","#",".","."}, {"#",".",".",".",".","#","."}, {"#",".",".",".",".","#","."}, {"#","#","#","#","#",".","."} } } -- The string to print. local text = "ABBA" -- Let us insert the data into the level data. for index = 1, #text, 1 do local char = string.sub(text, index, index) local charData = letters[char] local offset = index * 7 for row = 1, 9, 1 do local rowData = charData[row] for column = 1, 7, 1 do level[row][offset + column] = rowData[column] end end end -- Print everything for row = 1, 25, 1 do local rowData = level[row] for column = 1, 80, 1 do io.write(rowData[column]) end print() end You save you letters in a lookup table and then copy them, piece by piece, to the level data. Here I replaced the numbers with dots and number signs to make it prettier on the command line. Alternately to that you can also "render" the words into a prepared buffer and then insert that into the level data by using the same logic.
Count number of dictionarys in dictionary in swift
I have a buch of accounts stored in a string dictionary and i would like to count the number of accounts existing, so basicly a ".count" but to find the number of dictionaries created. var dictionary: [String : [ String ]] = ["" : []] let storeString = "StoreString" func addUpdateArray(strings: [String], index: Int) { let locator = storeString + index.description dictionary[locator] = strings } addUpdateArray(["Account1", "Hy"], 1) addUpdateArray(["Account2", "Hey"], 3) and now I would like to see how many accounts are have created of the kind dictionary, is ther a way?
Something like this? var accounts = [String:[String:String]]() // or whatever your structure is accounts["Edmund"] = [ "amount": "23.87", "curreny": "dollars" ] accounts["Baldrick"] = [ "amount": "23.87", "curreny": "dollars" ] accounts["Percy"] = [ "amount": "87.00", "curreny": "peso" ] println(accounts.keys.array.count) // 3
If you have dictionary of dictionaries and you want to count the number of actual values inside, you can do it like this: var accounts = [ "accountsGroup1" : ["account1", "account2", "account3", "account4"], "accountsGroup2" : ["account1", "account2"], "accountsGroup3" : ["account1", "account2", "account3", "account4"] ] let accountsCount = accounts.values.map { $0.count } let numberOfAllAccounts = reduce(accountsCount, 0) { $0 + $1 } println(numberOfAllAccounts)