Объединить разницу с данными, найденными в CSV с помощью JavaScript - PullRequest
0 голосов
/ 05 апреля 2019

Я могу найти имя файла в CSV и проверить, есть ли оно там:

//Open created .csv and check if file is already there

folderName = "~/Desktop/"
docRef = activeDocument;
var now = new Date();
var logfile_name = now.getFullYear() + "-"+ now.getMonth() + "-" + now.getDate() + '.csv'

var fileOut = new File(folderName+logfile_name);

fileOut.open("r");
var str ="";
while(!fileOut.eof)
str += fileOut.readln();

fileOut.close();

//input what to search for
var n = str.match(docRef.name);

Я всегда могу добавить новую строку и сохранить заголовок:

folderName = "~/Desktop/"

//Create File with todays date
var now = new Date();
var logfile_name = now.getFullYear() + "-"+ now.getMonth() + "-" + now.getDate() + '.csv'
var fileOut = new File(folderName+logfile_name);

if (!fileOut.exists) {
fileOut.open("w");
fileOut.writeln("Filename, Department, Steps, Tools, Liquify, Pen Tool, Clone Stamp, Patch Tool, Spot Healing Brush, Free Transform, Dust and Scratches, Color Correction, Replace Color");
fileOut.writeln(docRef.name, ",", departmentNumber, ",", MyHistoryStates, ",", HowManyTools, ",", liquifyUsed, ",", pentoolUsed, ",", clonestampUsed, ",", patchtoolUsed, ",", spothealingbrushUsed, ",", freetransformUsed, ",", dustandscratchesUsed, ",", colorcorrectionUsed, ",", replacecolorUsed);
} else {
fileOut.open("a");
fileOut.writeln(docRef.name, ",", departmentNumber, ",", MyHistoryStates, ",", HowManyTools, ",", liquifyUsed, ",", pentoolUsed, ",", clonestampUsed, ",", patchtoolUsed, ",", spothealingbrushUsed, ",", freetransformUsed, ",", dustandscratchesUsed, ",", colorcorrectionUsed, ",", replacecolorUsed);

}

fileOut.close();

В настоящее время после 3-х запусков выводит, как показано ниже: enter image description here

Но сейчас я пытаюсь сделать так, чтобы при следующем запуске сценария он проверял:

  • если имя файла уже в CSV, то concatenate MyHistoryStates («Шаги» в CSV).
  • если какое-либо из 9 булевых значений изменилось, замените его новым значением.
  • все без создания новых линий / ячеек, просто путем обновления того, что уже есть

Так это будет выглядеть примерно так: enter image description here

Не уверен, имеет ли это смысл :(

1 Ответ

0 голосов
/ 06 апреля 2019

Я бы сделал что-то вроде этого: создать объект объектов со всеми данными и именем файла в качестве свойства.Если новое имя файла уже есть в этом объекте, обновите шаги и все, что вам нужно, если его нет в объекте, добавьте его как новый элемент.Затем преобразуйте объекты обратно в строки и запишите CSV-файл.

//fileOut is defined already
fileOut.open("r");
var myObj = {};
while (!fileOut.eof)
{
    var csvLine = fileOut.readln().split(','); //create an array from csv string
    myObj[csvLine[0]] = createObject(csvLine); //create an object {'S208032.tif':{department: 32, steps: 5, tools: false, etc}}
};

//newCsvFile is defined already and is an array, similar to fileOut.readln().split(',')
myNewData[newCsvFile[0]] = createObject(newCsvFile)

for (var fileName in myObj)
{
    // if filename from newCsvFile is already in the csv
    if (fileName == newCsvFile[0])
    {
        //update steps
        myObj[fileName].steps += myNewData[fileName].steps;

        // change other properties as you want
        myObj[fileName].liquify = myNewData[fileName].liquify
        // etc...
    }
    // if filename from newCsvFile isn't in the csv
    else
    {
        //create a new entry in myObj with data from the new string
        myObj[newCsvFile[0]] = myNewData[newCsvFile[0]];
    }
};

//transform objects to strings
//write csv file

function createObject(data)
{
    return {
        department: data[1],
        steps: data[2],
        tools: data[3],
        liquify: data[4],
        //etc...
    }
};
...