[AI CC-CC2021] Чтение данных для замены из файла

ъьы

Участник
Топикстартер
Сообщения
34
Реакции
2
Привет! Подскажите пожалуйста в чём у меня ошибка? Задача такая: есть текстовый файл, в котором есть некоторое кол-во строк. Каждую строку разбивает табуляция. Скрипт ищет в выделенном фрейме значения, соответствующие той части строки текстового файла, которая находится слева от табуляции и заменяет это значение на ту часть той же строки, которая находится справа от табуляции. Пример:

Если в файле есть строка "ля-ля-ля<табуляция>трам-пам-пам", то скрипт, найдя в выделеном текстовом фрейме "ля-ля-ля", должен будет заменить его на "трам-пам-пам".

Вот мой код и сейчас он делает не то что нужно. Я просто эксперементировал, застрял и подумал, что, вероятно уже проще попросить помощи.


Код:
var aFile = File ("d:/replace.txt");
aFile.open("r");
var zamenaFile = aFile.read();
aFile.close();
 
var zamena = zamenaFile.split("\n");
var zamenaSplit = new Array (zamena.length-1);
for (i=0; i<zamena.length-1; i++) {
    xy = zamena[i].split( "\t");
    zamenaSplit[i] = xy;
}
 
myLine = app.activeDocument.selection[0];

//for (i=0; i<zamena.length; i++) {
//myLine.contents = myLine.contents.replace(zamenaSplit[0,0], zamenaSplit[0,1]);
myLine.contents = myLine.contents.replace("a", zamenaSplit[0]);
//}
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Вы предлагаете скачать и отладить ваш скрипт?
Судя по тому, что на дворе пятница это представляется затруднительным и маловероятным
Поэтому для скорейшего понимания сторон, объясните своими словами что именно
он делает не то что нужно
 

ъьы

Участник
Топикстартер
Сообщения
34
Реакции
2
Вы предлагаете скачать и отладить ваш скрипт?
Судя по тому, что на дворе пятница это представляется затруднительным и маловероятным
Поэтому для скорейшего понимания сторон, объясните своими словами что именно
Он ищет в текстовом фрейме текст, в данном случае это "а" и когда находит первое попавшееся соответствие, меняет его на первую строку файла replace.txt. Только вместо табуляции там запятая. То есть как я понимаю двухмерный массив zamenaSplit из файла "replace.txt" сформирован правильно. Но как искать запись из первой ячейки и заменять на запись из второй я никак не соображу.

Разрешите, я заберу эту фразу на подпись?
Пожалуйста.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Брр, ваши объяснения еще больше туману напустили %8
Он ищет в текстовом фрейме текст, в данном случае это "а"
А в общем случае что вместо a должно быть?
Только вместо табуляции там запятая.
Так запятая разделитель или табуляция? %8
То есть как я понимаю двухмерный массив zamenaSplit из файла "replace.txt" сформирован правильно.
Я по вашему коду никакого двумерного массива не вижу. То есть, вроде как заполняется двумерный массив, а в replace используется нулевой элемент одномерного. И как вы проверили что сформирован правильно? alertом?
Но как искать запись из первой ячейки и заменять на запись из второй я никак не соображу.
Из какой "первой ячейки" в какую "вторую"? 'otbline''fp'
 

ъьы

Участник
Топикстартер
Сообщения
34
Реакции
2
Брр, ваши объяснения еще больше туману напустили %8

А в общем случае что вместо a должно быть?
Должно получиться то, что описано в первом сообщении поста до кода. Там даже пример есть.

Так запятая разделитель или табуляция? %8
В файле разделитель -- табуляция. Код, который я разместил в посте, заменяет в выделенном фрейме искомый текст "а" на первую строку файла, но разделённую запятой вместо табуляции.

Я по вашему коду никакого двумерного массива не вижу. То есть, вроде как заполняется двумерный массив, а в replace используется нулевой элемент одномерного. И как вы проверили что сформирован правильно? alertом?
Я вижу как он заменяет текст. Например если
Код:
myLine.contents = myLine.contents.replace("a", zamenaSplit[0]);
заменить на:
Код:
myLine.contents = myLine.contents.replace("a", zamenaSplit);
То он забабахает в тектовый фрейм вместо искомой "а" весь файл. Только вместо табуляций будут запятые.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
То он забабахает в тектовый фрейм вместо искомой "а" весь файл. Только вместо табуляций будут запятые.
Ну вообще говоря replace по легенде меняет строку на строку
А у вас в случае
myLine.contents = myLine.contents.replace("a", zamenaSplit[0]);
второй параметр не строка то вовсе а одномерный массив, а в
myLine.contents = myLine.contents.replace("a", zamenaSplit);
так вообще двумерный.
Зачем вы меняете строку на массив? 'hmmm'
 

~RA~

Одарённая.
12 лет на форуме
Сообщения
11 861
Реакции
3 450
Последнее редактирование:

ъьы

Участник
Топикстартер
Сообщения
34
Реакции
2
Зачем вы меняете строку на массив? 'hmmm'
Я пытался понять в чём ошибка и уже начал туда в аргументы запихивать всё подряд. Как я понимаю массив данных у меня есть. Я не понимаю как обращаться с ними, как их передавать методу replace. Сначала я хочу понять как взять конкретные значения из файла. Например из пятой строки файла взять левую часть строки (до табуляции), попытаться найти её в текстовом фрейме и заменить на правую часть (после табуляции). Я думаю, что главное понять как это сделать, а потом просто в цикл это засунуть.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Разве не нулевой элемент одномерного массива?
Этот элемент - сам по себе массив. Обрати внимание 8 строчками выше - результат split - массив.
Например из пятой строки файла взять левую часть строки (до табуляции),
Допустим все вы сделали верно и увас реально двумерный массив zamenaSplit то вариант
Код:
replace(zamenaSplit[i][0], zamenaSplit[i][1])
в цикле по идее должен работать. Но сразу обращаю внимание, что менять будет только одно первое вхождение.
 
  • Спасибо
Реакции: ъьы

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Код:
myLine = app.activeDocument.selection[0];
Document.selection
Data Type: any
Adobe Illustrator CS6 Type Library
The selection within the document.

Тут важно что? Тут важно, что тип any, а вовсе не Array of any. Понятно, что следует поменять?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Document.selection
Data Type: any
Adobe Illustrator CS6 Type Library
The selection within the document.

Тут важно что? Тут важно, что тип any, а вовсе не Array of any. Понятно, что следует поменять?
Да ну брось
Здесь он все правильно сделал, не путай человека
 

ъьы

Участник
Топикстартер
Сообщения
34
Реакции
2
Код:
replace(zamenaSplit[i][0], zamenaSplit[i][1])
в цикле по идее должен работать. Но сразу обращаю внимание, что менять будет только одно первое вхождение.
Работает, большое спасибо. Я неправильно обращался к двумерному массиву. В этом была проблема. То что меняться будет только первое совпадение -- так и должно быть. Вот рабочий код, может быть кому-то пригодится:

Код:
var aFile = File ("d:/replace.txt");
aFile.open("r");
var zamenaFile = aFile.read();
aFile.close();
 
var zamena = zamenaFile.split("\n");
var zamenaSplit = new Array (zamena.length-1);
for (i=0; i<zamena.length-1; i++) {
    xy = zamena[i].split( "\t");
    zamenaSplit[i] = xy;
}
 
myLine = app.activeDocument.selection[0];

for (i=0; i<zamenaSplit.length; i++) {
myLine.contents = myLine.contents.replace(zamenaSplit[i][0], zamenaSplit[i][1]);
}
 
redraw();
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Вот и хорошо вот и баиньки
А теперь, раз уж так решились все заботы, вы мне объясните смысл переприсваивания в цикле через xy? Почему не через push?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847

ъьы

Участник
Топикстартер
Сообщения
34
Реакции
2
Вот и хорошо вот и баиньки
А теперь, раз уж так решились все заботы, вы мне объясните смысл переприсваивания в цикле через xy? Почему не через push?
Понятия не имею, я скриптосооружением занимаюсь третий день на работе между делом. Этот скрипт основан на скрипте, который рисовал фигуры по координатам, полученным из текстового файла. Потом я подумал, что можно было бы просто брать substring до табуляции и менять его на substring после табуляции, без всяких двумерных массивов, но уже голова не варит, а работы много. Работает и хорошо.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 197
Реакции
10 847
Потом я подумал, что можно было бы просто брать substring до табуляции и менять его на substring после табуляции, без всяких двумерных массивов, но уже голова не варит, а работы много. Работает и хорошо.
На будущее вам совет - в яваскрипте необязательно объявлять массив сразу нужной длины.
Достаточно сделать пустой var arr= new Array(); к которому добавлять элементы arr.push(newelem);
 
  • Спасибо
Реакции: ъьы