Еще один вариант, когда вы сначала создаете таблицу соответствия
(lookup <- do.call(rbind, lapply(mylist, stack)))
# values ind
#a.1 Yes AA
#a.2 No AB
#a.3 Maybe AC
#b.1 Yes BA
#b.2 No BB
#b.3 Maybe BC
, а затем используете lapply
и match
для замены
lapply(myanswers, function(x) lookup$values[match(x, lookup$ind)])
#$a
#[1] "Yes"
#
#$b
#[1] "Maybe"
Если ручное преобразование занимает слишком много времени, а автоматическое преобразование не работает, я думаю, что единственным другим вариантом будет создание собственного преобразователя. Вы могли бы написать простое консольное приложение, которое берет путь к каталогу в командной строке и обрабатывает каждый файл в этом каталоге. Это не слишком сложно - вот я и начну:
using System;
using System.IO;
class Program
{
const string ScriptStartTag = "<script language=\"CS\" runat=\"server\">";
const string ScriptEndTag = "</script>";
static void Main(string[] args)
{
DirectoryInfo inPath = new DirectoryInfo(args[0]);
DirectoryInfo outPath = new DirectoryInfo(args[0] + "\\codebehind");
if (!outPath.Exists) inPath.CreateSubdirectory("codebehind");
foreach (FileInfo f in inPath.GetFiles())
{
if (f.FullName.EndsWith(".aspx"))
{
// READ SOURCE FILE
string fileContents;
using (TextReader tr = new StreamReader(f.FullName))
{
fileContents = tr.ReadToEnd();
}
int scriptStart = fileContents.IndexOf(ScriptStartTag);
int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart);
string className = f.FullName.Remove(f.FullName.Length-5).Replace("\\", "_").Replace(":", "_");
// GENERATE NEW SCRIPT FILE
string scriptContents = fileContents.Substring(
scriptStart + ScriptStartTag.Length,
scriptEnd-(scriptStart + ScriptStartTag.Length)-1);
scriptContents =
"using System;\n\n" +
"public partial class " + className + " : System.Web.UI.Page\n" +
"{\n" +
" " + scriptContents.Trim() +
"\n}";
using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".cs"))
{
tw.Write(scriptContents);
tw.Flush();
}
// GENERATE NEW MARKUP FILE
fileContents = fileContents.Remove(
scriptStart,
scriptEnd - scriptStart + ScriptEndTag.Length);
int pageTagEnd = fileContents.IndexOf("%>");
fileContents = fileContents.Insert(PageTagEnd,
"AutoEventWireup=\"true\" CodeBehind=\"" + f.Name + ".cs\" Inherits=\"" + className + "\" ");
using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name))
{
tw.Write(fileContents);
tw.Flush();
}
}
}
}
}
30 минут кодирования, 30 минут отладки. Есть некоторые очевидные ошибки - например, если ваш код содержит закрывающий тег скрипта где-нибудь внутри , то он не будет правильно экспортирован. Результаты не будут хорошими, но это должно позаботиться о 90% вашего кода, и вы сможете очистить любые результаты проблем вручную. Ну вот, это поможет?
если ваш aspx-файл имеет 2 раздела и вы можете разделить его механически, почему бы вам не написать небольшой парсер для автоматизации работы? Это не должно быть сложно, это просто манипуляции с текстом и рекурсивный поиск файлов.
Честно говоря, я не знаю быстрого пути.
Вероятно, лучше всего будет создать новую страницу и скопировать вставку, пока все не заработает, затем удалите источник, переименуйте ваш новый файл на старое имя и перестроить.
Не идеальный, но, вероятно, самый быстрый / самый чистый / самый безопасный способ переноса.
В основном вам нужно создать файл класса. Наследуйте класс от System.Web.UI.Page, а затем измените директиву страницы для указания на код позади.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_Default" %>
Где Inherits - это имя вашего файла класса, а CodeBehind - это файл кода, который вы только что создали , Возможно, вам потребуется перезагрузить проект, чтобы в обозревателе решений отобразился вложенный файл, но даже если вы этого не сделаете, он должен работать.
Вы также можете проверить принятый ответ, чтобы найти альтернативу. Как IIS узнает, обслуживает ли он веб-сайт или проект веб-приложения?
Большое спасибо! Вот немного измененная версия, если ваш код написан на VB.Net. Просто скомпилируйте и запустите конвертер в каждой папке, содержащей сайты aspx.
using System.IO;
namespace Converter
{
class Program
{
const string ScriptStartTag = "<script runat=\"server\">";
const string ScriptEndTag = "</script>";
static void Main(string[] args)
{
string currentDirectory = System.Environment.CurrentDirectory;
var inPath = new DirectoryInfo(currentDirectory);
var outPath = new DirectoryInfo(currentDirectory);
if (!outPath.Exists) inPath.CreateSubdirectory("codebehind");
foreach (FileInfo f in inPath.GetFiles())
{
if (f.FullName.EndsWith(".aspx"))
{
// READ SOURCE FILE
string fileContents;
using (TextReader tr = new StreamReader(f.FullName))
{
fileContents = tr.ReadToEnd();
}
int scriptStart = fileContents.IndexOf(ScriptStartTag);
int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart);
string className = f.FullName.Remove(f.FullName.Length - 5).Replace("\\", "_").Replace(":", "_");
// GENERATE NEW SCRIPT FILE
string scriptContents = fileContents.Substring(
scriptStart + ScriptStartTag.Length,
scriptEnd - (scriptStart + ScriptStartTag.Length) - 1);
scriptContents =
"Imports System\n\n" +
"Partial Public Class " + className + " \n Inherits System.Web.UI.Page\n" +
"\n" +
" " + scriptContents.Trim() +
"\nEnd Class\n";
using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".vb"))
{
tw.Write(scriptContents);
tw.Flush();
}
// GENERATE NEW MARKUP FILE
fileContents = fileContents.Remove(
scriptStart,
scriptEnd - scriptStart + ScriptEndTag.Length);
int pageTagEnd = fileContents.IndexOf("%>");
fileContents = fileContents.Insert(pageTagEnd,
"AutoEventWireup=\"false\" CodeBehind=\"" + f.Name + ".vb\" Inherits=\"" + className + "\" ");
using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name))
{
tw.Write(fileContents);
tw.Flush();
}
}
}
}
}
}